2. 音视频基础

做音频开发这些年,我几乎每天都在跟这几种格式打交道。选 Codec 这事儿,说白了就是一场权衡——要音质就得牺牲体积,要兼容就得放弃效率。今天我把它们掰开揉碎了讲清楚。

一、先看一张总览图

下面这张图梳理了五种主流音频 Codec 的核心定位。我习惯把它贴在工位上,每次选型前扫一眼,基本不会跑偏。

主流音频 Codec 技术定位总览 有损压缩(感知编码) MP3 1993年 · 专利壁垒 AAC 1997年 · 苹果生态 Opus 2012年 · 开源免专利 无损压缩 / 无压缩 FLAC 2001年 · 开源无损 WAV 1991年 · PCM裸流 压缩率 vs 保真度 选型核心:有损看码率与感知质量,无损看压缩比与解码性能 WAV 本质是容器,内部通常为 PCM 数据,不压缩

二、逐个拆解:每个 Codec 的脾气秉性

1. MP3 —— 老将,但该退就退

MP3 是音频压缩的鼻祖。1993 年诞生,靠心理声学模型砍掉人耳不敏感的频率成分。128kbps 是它的黄金码率,再低就明显有「水声」了。

我个人的经验:MP3 在 128kbps 以下,高频会丢失大量细节。有一次我做语音识别的前端处理,用 MP3 压缩后识别率掉了 8 个点,换成 Opus 才救回来。

适用场景:老旧设备兼容、低码率广播、对音质要求不高的语音存档。

避坑:别在 64kbps 以下用 MP3 做音乐,那声音像隔着一层棉被。

2. AAC —— 苹果生态的默认选择

AAC 是 MP3 的升级版。同样的 128kbps,AAC 的听感明显更干净。它支持更多采样率(8kHz-96kHz)和多声道(最多 48 通道)。

我记得有一次给直播平台做音频链路优化,从 MP3 切到 AAC,码率降了 20%,用户反馈的「音质变差」投诉反而少了。为什么?因为 AAC 在低码率下的掩蔽模型更精细。

特性 MP3 AAC
诞生年份 1993 1997
典型码率 128-320 kbps 64-320 kbps
感知质量 @128kbps 良好 优秀
多声道支持 最多 2 声道 最多 48 声道
专利状态 已过期(部分地区) 需授权(但苹果免费用)

小技巧:如果你的目标平台是 iOS/macOS,AAC 是原生硬件加速的,解码功耗比软件解码低 30% 左右。

3. Opus —— 我目前最推荐的通用 Codec

Opus 是 2012 年 IETF 标准化的开源 Codec。它把 SILK(语音)和 CELT(音乐)两种编码器合在一起,码率范围从 6kbps 到 510kbps 全覆盖。

说实话,Opus 是我现在做新项目时的首选。原因很简单:免专利、全平台、低延迟。它的算法延迟最低能到 5ms,而 AAC 通常在 20ms 以上。

核心优势:

  • 码率自适应:6-510 kbps 连续可调
  • 采样率支持:8kHz-48kHz
  • 延迟:5ms-60ms 可配置
  • 开源:无任何专利限制

我曾经在一个实时合唱 App 里用 Opus,延迟压到 20ms,配合 Jitter Buffer 基本感觉不到不同步。换成 AAC 的话,光编码延迟就 40ms 了。

注意:Opus 在 64kbps 以下的音乐编码质量会明显下降。如果你做高保真音乐流,建议码率拉到 128kbps 以上。

4. FLAC —— 无损压缩的标杆

FLAC 是 Free Lossless Audio Codec 的缩写。它把 PCM 数据压缩到原来 50%-60% 的大小,解压后和原始数据完全一致。

我习惯用 FLAC 做母带存档。有一次客户要 5 年前的录音重新混音,幸好当时存的是 FLAC,要是存了 MP3,高频细节早就丢光了。

参数 FLAC WAV (PCM)
压缩率 50%-60% 无压缩
解码复杂度 低(整数运算) 极低(直接读取)
元数据支持 完整(封面、歌词等) 有限(RIFF 块)
流式支持 支持 支持

经验之谈:FLAC 的压缩等级从 0 到 8,等级越高压缩率越大但编码越慢。我一般用等级 5,平衡速度和体积。等级 8 只多压 2%-3%,但编码时间翻倍。

5. WAV —— 最原始,也最可靠

WAV 本质是一个容器格式,里面通常装的是 PCM 裸数据。44.1kHz/16bit 的立体声 WAV 一秒约 172KB,一首歌 50MB 起步。

WAV 的好处是零延迟、零损失。我在做音频算法验证时,所有中间结果都存 WAV。为什么?因为任何有损压缩都会引入相位偏移,影响后续的 FFT 分析。

注意:WAV 文件大小受限于 RIFF 格式的 4GB 上限。录制长时间多轨音频时,建议用 RF64 或分段录制。

三、选型决策矩阵

下面这张表是我做选型时的最终判断依据。你直接对着需求查就行。

需求场景 推荐 Codec 理由
实时通话 / 低延迟 Opus 5ms 延迟 + 丢包补偿
音乐流媒体(高音质) AAC / Opus 256kbps 以上听感无差异
老旧设备兼容 MP3 几乎所有设备都支持
母带存档 / 后期制作 FLAC 无损 + 节省 40% 空间
音频算法开发 / 调试 WAV 零损失、零延迟、零歧义
低码率语音(< 32kbps) Opus (SILK 模式) 6kbps 仍可听懂

四、避坑指南

这些年踩过的坑,我列几个典型的:

  • 别用 MP3 做语音:MP3 的帧长是 1152 样本,编码延迟 26ms,做实时语音交互根本不行。Opus 的帧长可以短到 2.5ms。
  • AAC 的 LC 和 HE 版本别搞混:HE-AAC (v1/v2) 用 SBR 和 PS 技术提升低码率音质,但解码器必须支持。我见过有人用 HE-AAC 编码,播放器只支持 LC-AAC,结果声音像机器人。
  • FLAC 的 metadata 会拖慢流式加载:如果做网络流媒体,FLAC 的 metadata 块可能很大(尤其带封面图),建议把封面图单独外挂。
  • WAV 的字节序:WAV 默认是小端序(Little-Endian),但某些嵌入式平台是大端序。跨平台传输时务必确认字节序,否则出来的声音全是噪声。

五、一句话总结

选音频 Codec 没有银弹。我的原则是:新项目无脑 Opus,苹果生态用 AAC,存档用 FLAC,调试用 WAV,MP3 只留给那些实在跑不动新 Codec 的老古董。