4、音频转码与重采样:常用音频编码器(aac/mp3)、采样率转换(-ar)、声道布局(-ac)、音频质量(-q:a)
音频处理这块,说实话比视频要「温柔」一些。没有那么多关键帧、GOP 的复杂概念,但坑一点都不少。我刚开始用 FFmpeg 做音频转码时,觉得不就是换个格式嘛,结果出来的文件要么没声音,要么音质差得离谱,要么播放器直接不认。
这一章,咱们就把音频转码和重采样彻底捋清楚。你掌握了这些,后面做分段拼接时,音频流才能稳稳当当不出幺蛾子。
4.1 音频编码器选型:AAC vs MP3
做音频转码,第一步就是选编码器。目前最主流的两个就是 AAC 和 MP3。我个人的习惯是:能用 AAC 就不用 MP3,除非有特殊的兼容性要求。
| 特性 | AAC (Advanced Audio Coding) | MP3 (MPEG-1 Audio Layer 3) |
|---|---|---|
| 编码效率 | 同等码率下音质更好 | 稍逊于 AAC |
| 采样率支持 | 8 kHz ~ 96 kHz | 16 kHz ~ 48 kHz |
| 声道支持 | 最多 48 声道 | 最多 2 声道(立体声) |
| 容器兼容性 | MP4, MKV, FLV 等 | 几乎所有容器都支持 |
| FFmpeg 编码器 | aac (原生), libfdk_aac (第三方) |
libmp3lame (推荐), mp3 (原生) |
libfdk_aac,优先用它。它是目前公认质量最好的 AAC 编码器。如果没有,用原生的 aac 编码器也完全够用,注意加 -strict -2 参数(老版本需要)。
MP3 呢?说实话,现在除了某些老旧设备或特定广播场景,我基本不碰了。但如果你必须输出 MP3,记得用 libmp3lame,原生 MP3 编码器质量一般。
4.2 采样率转换:-ar 参数
采样率,说白了就是一秒钟采集多少个声音样本。44100 Hz 是 CD 音质,48000 Hz 是 DVD/视频常用标准。为什么要转采样率?
- 统一标准:分段拼接时,所有片段的采样率必须一致,否则拼接时会报错或出现音频不同步。
- 降低体积:语音类内容(比如播客、讲课),22050 Hz 甚至 16000 Hz 就够用了,没必要用 44100 Hz。
- 兼容性:某些播放器或平台只支持特定采样率。
FFmpeg 里用 -ar 参数指定输出采样率:
# 将音频采样率从 44100 Hz 转换为 16000 Hz
ffmpeg -i input.mp3 -ar 16000 output.wav
# 转码的同时转换采样率
ffmpeg -i input.mp4 -c:v copy -c:a aac -ar 48000 output.mp4
4.3 声道布局:-ac 参数
声道布局,就是声音是单声道、立体声还是 5.1 环绕声。用 -ac 参数指定输出声道数。
常见的场景:
- 立体声转单声道:语音类内容,左右声道一样,合并成单声道能省一半体积。
- 单声道转立体声:复制一份到右声道,没什么实际意义,但某些播放器强制要求立体声。
- 5.1 转立体声:向下混音(downmix),把环绕声混合成左右声道。
# 立体声转单声道(取平均)
ffmpeg -i input.mp3 -ac 1 output_mono.mp3
# 单声道转立体声(复制)
ffmpeg -i input_mono.wav -ac 2 output_stereo.wav
# 5.1 环绕声转立体声
ffmpeg -i input_5_1.mp4 -c:v copy -c:a aac -ac 2 output_stereo.mp4
嗯,这里有个细节。FFmpeg 默认的向下混音算法是 average,也就是把多个声道平均混合。但有时候你会觉得声音变小了,或者某些声道丢失了。这时候可以指定混音矩阵:
# 使用特定的混音矩阵(左声道保留,右声道丢弃)
ffmpeg -i input.mp3 -af "pan=mono|c0=FL" output_mono.wav
我个人建议,除非你很清楚自己在做什么,否则直接用 -ac 1 或 -ac 2 就好,FFmpeg 的默认行为在大多数情况下是合理的。
4.4 音频质量控制:-q:a 参数
视频有 -crf,音频也有类似的质量控制参数——-q:a。但注意,这个参数在不同编码器下的含义完全不同。
| 编码器 | -q:a 取值范围 | 说明 |
|---|---|---|
| libmp3lame | 0 ~ 9 | 0 最好,9 最差。通常用 2 ~ 5 |
| aac (原生) | 0.1 ~ 10 | 值越小质量越好。通常用 2 ~ 5 |
| libfdk_aac | 1 ~ 5 | 1 最好,5 最差。通常用 3 或 4 |
举个例子:
# MP3 高质量(VBR,可变码率)
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
# AAC 高质量
ffmpeg -i input.wav -c:a aac -q:a 2 output.m4a
# libfdk_aac 高质量
ffmpeg -i input.wav -c:a libfdk_aac -q:a 3 output.m4a
-b:a(固定码率)来控制质量,除非你有明确的码率限制(比如直播推流)。用 -q:a 让编码器自己决定什么时候用高码率、什么时候用低码率,效率更高,音质也更好。
我曾经在做一个播客平台的后处理脚本时,一开始全部用 -b:a 128k 固定码率。结果发现,有些安静的段落码率浪费严重,有些复杂的段落又不够用。后来换成 -q:a 2,文件体积平均小了 20%,听感反而更好了。
4.5 综合实战:音频转码与重采样
把上面几个知识点串起来,一个典型的音频转码命令长这样:
# 输入:任意格式 -> 输出:AAC, 48000 Hz, 立体声, 高质量
ffmpeg -i input.mp4 \
-c:v copy \
-c:a aac \
-ar 48000 \
-ac 2 \
-q:a 2 \
output.mp4
如果你在做分段拼接前的预处理,我建议统一做一次音频标准化:
# 统一音频参数,方便后续拼接
ffmpeg -i segment1.mp4 \
-c:v copy \
-c:a aac \
-ar 44100 \
-ac 2 \
-q:a 3 \
-af "volume=1.5" \
segment1_normalized.mp4
这里 -af "volume=1.5" 是音频滤镜,把音量放大 1.5 倍。为什么要做这个?因为不同来源的片段音量可能不一样,拼接起来忽大忽小,体验很差。
4.6 知识体系:音频转码核心流程
下面这张图,帮你把音频转码的决策路径理清楚:
你看,整个流程其实就是一个决策链:选编码器 -> 定采样率 -> 定声道 -> 定质量。每一步都有明确的参数对应,只要按这个顺序来,基本不会出错。
4.7 避坑指南
最后,分享几个我踩过的坑:
- 采样率不统一导致拼接失败:我曾经在拼接 10 个视频片段时,有一个片段的音频是 22050 Hz,其他都是 44100 Hz。FFmpeg 直接报错退出。从那以后,我所有预处理脚本里都强制加上了
-ar 44100。 - 声道数不匹配导致无声:有一次我把一个 5.1 声道的视频转成双声道,但忘记加
-ac 2,结果输出文件在普通播放器上只有左右声道有声音,中置和环绕全丢了。 - 质量参数用错:用
libmp3lame时,-q:a 0是最好,但用aac原生编码器时,-q:a 0反而最差。这个坑我至少犯了两次。
嗯,音频转码这块,说白了就是参数组合要记牢,流程要标准化。你只要把上面这张图刻在脑子里,以后遇到任何音频转码需求,都能快速搞定。