4、音频处理入门:音频重采样、声道转换、音频编码与音量调整
音频处理,说白了就是让声音文件「听话」。你要它变采样率、变声道、变格式、变响度,FFmpeg 都能干。这一章我带你把这四个最基础的操作过一遍。嗯,都是日常工作中高频到不能再高频的东西。
本章核心脉络:音频重采样(-ar)→ 声道转换(-ac)→ 音频编码(AAC/MP3)→ 音量调整(volume filter)。这四个操作可以单独用,也可以串成一条管道。我建议你按这个顺序学,因为后面的操作往往依赖前面的结果。
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
这条命令干了四件事:
- -ar 44100:重采样到 44.1kHz
- -ac 1:混合为单声道
- -c:a libmp3lame -b:a 128k:编码为 MP3,128kbps
- -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。知己知彼,百战不殆。