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 (原生)
我的建议:如果你在 FFmpeg 里编译了 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
注意:采样率转换不是简单的「抽点」或「插点」。FFmpeg 内部会使用重采样器(swresample)进行高质量的插值滤波。但如果你从低采样率转高采样率(比如 8000 Hz -> 48000 Hz),并不会增加实际信息量,只是「注水」而已。我曾经犯过这个错,以为转高了音质会变好,结果只是文件变大了。

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 知识体系:音频转码核心流程

下面这张图,帮你把音频转码的决策路径理清楚:

音频转码与重采样核心流程 音频转码与重采样核心决策流程 原始音频文件 选择编码器:AAC / MP3 设置采样率:-ar 44100 / 48000 设置声道:-ac 1 / 2 / 6 设置质量:-q:a 2 ~ 5 输出标准化音频 常见坑点 • 采样率不一致导致拼接失败 • 声道数不匹配导致无声 • 码率固定导致音质浪费 最佳实践 • 统一用 44100 Hz / 48000 Hz • 语音用单声道,音乐用立体声 • 用 -q:a 代替 -b:a

你看,整个流程其实就是一个决策链:选编码器 -> 定采样率 -> 定声道 -> 定质量。每一步都有明确的参数对应,只要按这个顺序来,基本不会出错。

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 采样率不统一导致拼接失败:我曾经在拼接 10 个视频片段时,有一个片段的音频是 22050 Hz,其他都是 44100 Hz。FFmpeg 直接报错退出。从那以后,我所有预处理脚本里都强制加上了 -ar 44100。
  • 声道数不匹配导致无声:有一次我把一个 5.1 声道的视频转成双声道,但忘记加 -ac 2,结果输出文件在普通播放器上只有左右声道有声音,中置和环绕全丢了。
  • 质量参数用错:用 libmp3lame 时,-q:a 0 是最好,但用 aac 原生编码器时,-q:a 0 反而最差。这个坑我至少犯了两次。

嗯,音频转码这块,说白了就是参数组合要记牢,流程要标准化。你只要把上面这张图刻在脑子里,以后遇到任何音频转码需求,都能快速搞定。