2. Codec基础概念
各位好,我是老周。今天咱们聊聊音频Codec的底层原理。说实话,很多做音视频开发的同学,调了几年Codec,却连PCM怎么变成比特流都说不清楚。这章我就把这块硬骨头啃一啃,用我这些年踩过的坑,帮你把基础打牢。
1. PCM采样与量化:数字音频的起点
PCM,全称脉冲编码调制。说白了,就是把连续的声波变成离散的数字点。你想想看,声波是连续的,但计算机只能处理0和1,怎么办?只能每隔一小段时间取一个点,再把这个点的幅度值用二进制表示出来。
核心公式:
采样率 × 位深 × 声道数 = 比特率(未压缩)
例如:44100 × 16 × 2 = 1411200 bps ≈ 1.41 Mbps
采样率决定了你能记录多高的频率。根据奈奎斯特定理,采样率必须大于信号最高频率的两倍。CD用44.1kHz,就是因为人耳上限约20kHz,留点余量。量化位深决定了动态范围。16bit能表示65536个等级,理论动态范围约96dB。24bit能达到144dB。
我在项目中遇到过一个坑:某次做语音采集,用了8bit量化,结果背景噪声全被放大了。后来换成16bit,信噪比立刻改善。所以啊,量化位深不是摆设,它直接决定了你的底噪水平。
| 参数 | 常见值 | 适用场景 | 我的建议 |
|---|---|---|---|
| 采样率 | 8kHz / 16kHz | 语音通话 | 语音用16kHz起步 |
| 采样率 | 44.1kHz / 48kHz | 音乐、广播 | 音乐用44.1kHz |
| 采样率 | 96kHz / 192kHz | 高保真录音 | 除非混音,否则没必要 |
| 位深 | 16bit | CD、流媒体 | 通用标准 |
| 位深 | 24bit | 录音、混音 | 后期处理留余量 |
实战技巧:做音频采集时,我习惯用24bit/48kHz录制原始素材,最后再降采样到16bit/44.1kHz发布。这样后期处理有足够的动态余量,不会出现削波。
2. 时域与频域变换:从波形到频谱
时域信号,就是咱们看到的波形图,横轴是时间,纵轴是幅度。但人耳对频率更敏感,所以编码时需要把时域信号转到频域。这里的关键工具就是傅里叶变换。
实际Codec里用的不是标准FFT,而是MDCT(改进型离散余弦变换)。为什么?因为MDCT能解决块边界效应。我刚开始做音频编码时,直接用FFT分块处理,结果块与块之间出现咔咔声,后来换成MDCT才搞定。
MDCT的特点:
- 50%重叠分帧,消除块边界
- 时域混叠抵消(TDAC)技术
- 能量集中度高,利于压缩
你想想看,一段音乐信号,时域上看密密麻麻,但转到频域后,你会发现大部分能量集中在少数几个频率上。这就是压缩的基础——把不重要的频率成分丢掉,只保留人耳敏感的部分。
// 伪代码:MDCT变换流程
function MDCT(input_frame) {
// 1. 加窗(正弦窗或KBD窗)
windowed = input_frame * window_function
// 2. 50%重叠
overlap = previous_windowed + windowed
// 3. 执行MDCT变换
spectrum = mdct_transform(overlap)
return spectrum
}
3. 心理声学模型:人耳的弱点就是压缩的机会
心理声学模型,说白了就是研究人耳听不见什么。人耳不是完美的,它有各种掩蔽效应。你想想看,在一个嘈杂的酒吧里,别人小声说话你根本听不见,这就是掩蔽。
心理声学模型的核心机制:
- 绝对听阈:人耳对不同频率的敏感度不同,2kHz-4kHz最敏感,低频和高频不敏感
- 频域掩蔽:一个强信号会掩盖附近频率的弱信号
- 时域掩蔽:强信号前后一段时间内的弱信号也会被掩盖
我曾经踩过的坑:做低码率编码时,为了省比特,把高频全部砍掉。结果音乐听起来像蒙了一层布。后来才明白,心理声学模型不是简单砍高频,而是根据掩蔽阈值动态分配比特。该保的保,该丢的丢。
心理声学模型的工作流程是这样的:先把音频信号分成若干子带,计算每个子带的掩蔽阈值。然后对比实际信号能量和掩蔽阈值,低于阈值的部分直接丢弃,高于阈值的部分分配更多比特。这样就能在保证听感的前提下,大幅降低码率。
4. AAC与MP3核心差异:新老两代的较量
MP3诞生于90年代初,AAC是90年代末的产物。两者都基于心理声学模型,但AAC在很多方面做了改进。我当年从MP3切换到AAC时,第一感觉就是同样码率下,AAC的声音干净多了。
| 对比维度 | MP3 | AAC | 我的评价 |
|---|---|---|---|
| 滤波器组 | 混合滤波器组(32子带+MDCT) | 纯MDCT(1024/960点) | AAC更简洁高效 |
| 窗函数 | 固定窗 | 正弦窗/KBD窗可选 | AAC更灵活 |
| 子带数量 | 32个等宽子带 | 1024个频线(可分组) | AAC频率分辨率更高 |
| 立体声编码 | MS/强度立体声 | MS/强度/参数立体声 | AAC效率更高 |
| 采样率支持 | 32/44.1/48kHz | 8-96kHz | AAC覆盖更广 |
| 典型码率 | 128-320kbps | 64-320kbps | AAC低码率优势明显 |
核心差异详解:
第一,滤波器组不同。MP3用了32子带的多相滤波器加MDCT的混合结构,而AAC直接用纯MDCT。这意味着AAC的频率分辨率更高,能更精细地控制每个频率成分的量化噪声。
第二,窗函数更灵活。AAC支持正弦窗和KBD窗两种,可以根据信号特性动态切换。MP3只有一种固定窗,遇到瞬态信号时容易产生预回声。
第三,立体声编码更高效。AAC除了支持MP3的MS立体声和强度立体声外,还增加了参数立体声。在低码率下,参数立体声能大幅节省比特。
选型建议:如果码率充裕(256kbps以上),MP3和AAC差距不大。但码率低于128kbps时,AAC明显优于MP3。我个人习惯:流媒体用AAC 128kbps,本地收藏用AAC 256kbps或无损。
5. 知识体系总览
下面这张图,我把本章的核心知识点串起来了。你对照着看,思路会更清晰。
嗯,这张图把本章的知识体系串起来了。从PCM采集开始,经过时频变换,再到心理声学模型指导量化,最后落到AAC和MP3的具体实现上。你把这个流程吃透了,后面调Codec参数时就知道该动哪里了。
本章要点回顾:
- PCM采样率和位深决定了原始音频质量,选型时根据场景权衡
- MDCT是时频变换的核心工具,解决了块边界问题
- 心理声学模型利用人耳掩蔽效应,在保证听感的前提下压缩数据
- AAC在滤波器组、窗函数、立体声编码等方面全面优于MP3