4、音频处理入门:音频重采样、声道转换、音频编码与音量调整

音频处理,说白了就是让声音文件「听话」。你要它变采样率、变声道、变格式、变响度,FFmpeg 都能干。这一章我带你把这四个最基础的操作过一遍。嗯,都是日常工作中高频到不能再高频的东西。

本章核心脉络:音频重采样(-ar)→ 声道转换(-ac)→ 音频编码(AAC/MP3)→ 音量调整(volume filter)。这四个操作可以单独用,也可以串成一条管道。我建议你按这个顺序学,因为后面的操作往往依赖前面的结果。

音频处理入门 · 知识体系 原始音频文件 重采样 -ar 声道转换 -ac 编码输出 音量调整 volume 提示:音量调整可以在编码前或编码后做,但建议在编码前做,避免二次编码损失

4.1 音频重采样(-ar)

重采样,就是改变音频的采样率。比如把 44100 Hz 转成 48000 Hz。为什么要做这个?我遇到过最典型的场景:视频素材的音频是 48k,但你的项目工程要求 44.1k,不转的话播放会变调或者不同步。

FFmpeg 的重采样用 -ar 参数,语法很简单:

# 将输入音频重采样为 44100 Hz
ffmpeg -i input.wav -ar 44100 output.wav

# 同时重采样和编码
ffmpeg -i input.wav -ar 48000 -c:a aac output.m4a

我的经验:重采样时 FFmpeg 默认使用 swresample 库,质量不错。但如果你对音质有极致要求,可以加 -resampler soxr 使用 SoX 重采样器,质量更高,但速度慢一些。

常见的采样率对照表:

采样率 常见用途 说明
8000 Hz 电话语音 窄带,人声可懂即可
16000 Hz VoIP、语音识别 宽带语音,质量尚可
22050 Hz 低质量音乐 老式 MP3 常用
44100 Hz CD 音质 音乐行业标准
48000 Hz 视频、电影 视频行业标准
96000 Hz 高解析音频 Hi-Res,录音棚常用

注意:采样率不是越高越好。48k 转 44.1k 会有轻微的质量损失,因为不是整数倍关系。我曾经在做一个播客项目时,反复在 48k 和 44.1k 之间来回转,最后音质明显劣化。尽量保持一次到位。

4.2 声道转换(-ac)

声道转换,就是改变音频的声道数量。最常见的是立体声转单声道,或者单声道转立体声。你想想看,很多语音录音是单声道的,但视频平台要求立体声,这时候就得转。

用 -ac 参数:

# 立体声转单声道(混合左右声道)
ffmpeg -i stereo.wav -ac 1 mono.wav

# 单声道转立体声(复制到左右声道)
ffmpeg -i mono.wav -ac 2 stereo.wav

# 5.1 环绕声转立体声(下混)
ffmpeg -i surround.wav -ac 2 stereo.wav

FFmpeg 的声道映射规则:

  • -ac 1:多声道混合为单声道,默认使用平均混合
  • -ac 2:多声道下混为立体声,FFmpeg 会自动做声道映射
  • -ac 6:上混为 5.1 环绕声,会填充静音声道

避坑指南:我曾经在处理一个 5.1 声道电影音频时,直接用 -ac 2 下混,结果对白音量变得很小。后来发现 FFmpeg 默认的下混矩阵会把中置声道(对白)衰减。解决方案是用 pan 滤镜手动控制混音比例:-af "pan=stereo|FL=FC+0.707*FL+0.707*BL|FR=FC+0.707*FR+0.707*BR"。

4.3 音频编码(AAC / MP3)

编码,就是把原始 PCM 数据压缩成有损格式。最常用的两个格式是 AAC 和 MP3。我个人习惯:视频配乐用 AAC,纯音频分发用 MP3。为什么?AAC 在低码率下表现更好,MP3 的兼容性更广。

4.3.1 编码为 AAC

# 使用 FFmpeg 内置 AAC 编码器
ffmpeg -i input.wav -c:a aac -b:a 128k output.m4a

# 使用 libfdk_aac(质量更好,但需要编译时开启)
ffmpeg -i input.wav -c:a libfdk_aac -b:a 128k output.m4a

# 指定采样率和声道
ffmpeg -i input.wav -c:a aac -ar 44100 -ac 2 -b:a 192k output.m4a

4.3.2 编码为 MP3

# 使用 libmp3lame 编码器
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3

# 使用可变比特率(VBR),质量 0-9,0 最好
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3

# 固定比特率(CBR)
ffmpeg -i input.wav -c:a libmp3lame -b:a 128k -minrate 128k -maxrate 128k output.mp3
编码器 格式 质量 速度 推荐场景
aac (FFmpeg 内置) AAC 良好 快 通用视频配乐
libfdk_aac AAC 优秀 中等 高质量音频流
libmp3lame MP3 良好 快 音乐分发、播客
pcm_s16le WAV 无损 极快 编辑中间文件

注意:-c:a aac 用的是 FFmpeg 内置的 AAC 编码器,质量还行但不算顶级。如果你需要高质量 AAC,建议编译时开启 --enable-libfdk-aac。不过要注意,libfdk_aac 的许可证和 FFmpeg 不兼容,所以官方编译版本默认不带。

4.4 音量调整(volume filter)

音量调整,说白了就是让声音变大或变小。FFmpeg 用 volume 滤镜来实现。我遇到过最头疼的情况:采访视频里两个人的音量差太多,一个像蚊子叫,一个像打雷。这时候就得用 volume 滤镜做归一化。

基本用法:

# 音量加倍(增加 6dB)
ffmpeg -i input.wav -af "volume=2.0" output.wav

# 音量减半(减少 6dB)
ffmpeg -i input.wav -af "volume=0.5" output.wav

# 用 dB 单位调整(增加 3dB)
ffmpeg -i input.wav -af "volume=3dB" output.wav

# 静音
ffmpeg -i input.wav -af "volume=0" output.wav

volume 滤镜的参数模式:

  • 线性倍数:volume=1.5 表示放大 1.5 倍
  • dB 值:volume=3dB 表示增加 3 分贝
  • 精确控制:volume=0.8 降低 20% 音量

我的经验:音量调整时要注意不要削波(clipping)。如果原始音频已经接近 0dB,再放大就会产生爆音。我曾经在做一个播客后期时,把一段录音放大了 6dB,结果听起来全是噼里啪啦的失真。后来我改用 loudnorm 滤镜做响度归一化,效果就好多了。

更高级的音量控制——响度归一化:

# 使用 loudnorm 滤镜做 EBU R128 响度归一化
ffmpeg -i input.wav -af "loudnorm=I=-16:LRA=11:TP=-1.5" output.wav

参数说明:

  • I:综合响度目标值(单位 LUFS),-16 是播客常用值
  • LRA:响度范围,11 是推荐值
  • TP:真峰值上限,-1.5dB 防止削波

4.5 综合实战:一条命令搞定所有

好了,把上面四个操作串起来。假设你有一个 48kHz 立体声 WAV 文件,要转成 44.1kHz 单声道 MP3,音量提升 3dB:

ffmpeg -i input.wav \
  -ar 44100 \
  -ac 1 \
  -c:a libmp3lame -b:a 128k \
  -af "volume=3dB" \
  output.mp3

这条命令干了四件事:

  1. -ar 44100:重采样到 44.1kHz
  2. -ac 1:混合为单声道
  3. -c:a libmp3lame -b:a 128k:编码为 MP3,128kbps
  4. -af "volume=3dB":音量提升 3dB

注意顺序:滤镜(-af)在编码器之前执行。所以上面的命令是先调整音量,再编码。如果你把 -af 放在 -c:a 后面,FFmpeg 会报错。嗯,这个坑我踩过。

再给一个更复杂的例子——批量处理文件夹里的所有 WAV 文件:

for f in *.wav; do
  ffmpeg -i "$f" -ar 44100 -ac 1 -c:a aac -b:a 96k -af "volume=2.0" "${f%.wav}.m4a"
done

这个脚本会把当前目录下所有 WAV 转成 44.1kHz 单声道 AAC,音量翻倍。我在做语音数据集清洗时经常用这种批量处理。

最后一个小技巧:如果你不确定当前音频的参数,先用 ffprobe 看一眼:ffprobe -v error -show_entries stream=sample_rate,channels,codec_name input.wav。知己知彼,百战不殆。