很多人学数字音频时,难点往往不是公式,而是概念层次太多:采样率、位深、PCM、WAV、AAC、MP3、容器、编码、解码,单独看都不陌生,放在一起就容易混。
这篇先不铺太多术语,先把最基础的参数、常见格式和处理链路理顺。
1. 数字音频的四个基础参数
理解数字音频,先抓住四个核心参数:
- 采样率
- 采样位深
- 声道数
- 比特率
这四个参数基本对应四个问题:一秒钟采多少次样、每个采样点保留多少精度、同时有几路独立声音、单位时间里需要多少数据量。
采样率
采样率表示每秒钟对模拟信号取样的次数,单位通常是 Hz。常见值有:
- 8 kHz:电话语音
- 16 kHz:语音算法常见
- 44.1 kHz:CD 音频
- 48 kHz:视频和专业链路常见
- 96 kHz / 192 kHz:更高规格音频场景
采样率越高,理论上能保留的高频信息越多,但体积和处理成本也会一起上去。
理解时还可以先记一个基本结论:采样率至少要大于信号最高频率的两倍,才更有可能比较完整地还原原始信号。
位深
位深表示每个采样点用多少 bit 描述振幅。常见情况包括:
- 16-bit:消费级场景最常见
- 24-bit:专业音频常见
- 32-bit float:更适合音频处理链路
位深越高,动态范围通常越大,细节保留能力也越强。
声道数
声道数描述同一时刻有几路独立通道:
- Mono:单声道
- Stereo:双声道
- 5.1 / 7.1:多声道
比特率
对 PCM 这类未压缩音频,可以先用一个近似公式理解:
比特率 = 采样率 × 位深 × 声道数
所以 48 kHz、16-bit、双声道 PCM 的数据量,明显会高于 16 kHz、16-bit、单声道语音流。
2. 为什么很多链路最后都要落到 PCM
PCM 是最直接的采样数据表达方式,本身不追求压缩率,但很适合作为处理链路里的基础格式。
大多数播放设备、音频算法和处理中间环节,最终都更容易消费 PCM。也正因为这样,很多压缩格式最后都要先解码成 PCM,再送到:
- 播放设备
- 音频特效链
- 语音算法
- 转码处理链
如果只记一件事,可以先记住:很多编码格式最后还是要回到 PCM。
3. 为什么要做音频编码
既然 PCM 这么直接,为什么还要编码?答案很简单:PCM 数据量太大,存储和传输成本高。
音频编码做的事情,本质上就是压缩数据,降低带宽和存储开销。很多有损编码之所以能在较低码率下还保持可接受听感,就是因为它们会利用时域冗余、频域冗余以及听觉冗余。
这也是为什么同样一段音频,压缩成 AAC、MP3、Opus 之后,体积能比原始 PCM 小很多。
4. 容器和编码不要混淆
这是最容易混淆的一组概念:
- 容器:负责“装”数据
- 编码:负责“压缩和表示”数据
例如:
- WAV、MP4、TS、MKV 是容器
- PCM、AAC、MP3、Opus 是编码格式
一个 MP4 文件里可能有视频流和音频流;一个 WAV 文件里常见的是 PCM;一个 M4A 文件里常见的是 AAC。
所以看到文件后缀,先判断容器;分析播放或转码问题时,再继续看里面的编码格式。
5. 常见格式该怎么理解
PCM
原始采样数据,不压缩,保真度高,适合作为算法和播放链路的基础格式。
WAV
一个很常见的容器,通常承载 PCM,也可以承载别的音频编码。它的好处是结构清楚、调试友好,而且文件头里通常会带上采样率、位深、声道数这些信息。
MP3
经典有损压缩格式,兼容性很好,应用范围也很广。
AAC
现代多媒体场景里非常常见,在中低码率下通常比 MP3 更有优势。
Opus
更偏低延迟、实时通信和语音场景,在互动式链路里很常见。
6. 一个典型的音频处理流程
工程里一个常见处理链路通常是:
- 获取输入
- 解复用
- 解码
- 输出 PCM
- 播放或继续处理
获取输入
输入可能来自:
- 本地文件
- 网络流
- 麦克风采集
- 视频容器里的音轨
解复用
如果音频被封装在 MP4、TS、MKV 这类容器里,先要把音频流拆出来。
解码
如果音频本身是 AAC、MP3、Opus 这类压缩格式,就需要解码成 PCM 或其他中间格式。
输出
输出之后可能是:
- 直接播放
- 重采样
- 混音
- 送给语音识别或降噪模块
7. 学音频时最值得先抓住什么
刚开始学音频,不用急着背完所有格式。先把这几层关系建立起来:
- 参数层:采样率、位深、声道数、码率
- 数据层:PCM
- 容器层:WAV / MP4 / TS
- 编码层:AAC / MP3 / Opus
- 流程层:解复用 -> 解码 -> PCM -> 播放 / 处理
这几层一旦理顺,后面再去看 FFmpeg、播放器、流媒体协议或者音频驱动,很多原本分散的概念就能自然连起来。
8. 总结
数字音频的底层其实不复杂:
- 先把模拟信号数字化
- 再根据场景决定是否压缩
- 最终在处理链路里回到便于播放和计算的格式
比死记术语更重要的,是随时分清你现在碰到的是参数问题、容器问题、编码问题,还是处理流程问题。