提示

FFmpeg 音频处理从入门到凑合听:转格式、剪音频、混音、降噪我全记下来了

之前那几篇 FFmpeg 博客都讲视频,这次专门写一篇音频的。起因是上个月做了个播客剪辑的小工具,要把嘉宾的录音降噪、调音量、拼成一条,再加个背景音乐。折腾下来发现 FFmpeg 处理音频比视频简单得多(滤镜少,速度快),但坑也不少——比如音量归一化、多音轨选择、格式兼容性。这篇把常用的音频命令和踩过的坑全记下来。

一、音频处理的基本概念(一句话版)

  • 采样率(sample rate):常见 44100 Hz(CD 质量)、48000 Hz(视频常用)。
  • 声道(channels):单声道(mono)、立体声(stereo)、5.1 等。
  • 码率(bitrate):128k、192k、320k,越高越清晰,文件越大。
  • 编码格式:MP3、AAC、Opus、FLAC(无损)、PCM(原始)。
  • 容器:MP3、M4A、FLAC、WAV(PCM 封装)。

FFmpeg 里音频相关的参数前缀一般是 -a(audio)或直接复用 -c:a

二、安装(快速过)

FFmpeg 安装看第一篇博客。确保编译时带了常用音频编码器:

ffmpeg -encoders | grep -E "mp3|aac|libopus"

如果没有 libmp3lame 或 aac,用完整版二进制。

三、常用音频参数速查

参数  含义  例子
-c:a    音频编码器   -c:a libmp3lame
-b:a    音频码率    -b:a 128k
-ar 采样率 -ar 44100
-ac 声道数 -ac 1(单声道)
-af 音频滤镜    -af "volume=2.0"
-vn 不包含视频   提取纯音频
-map 0:a:0  选第一个输入的第一个音频流   多音轨时用

四、基础转换命令

4.1 格式转换(不改变质量)

# MP3 转 M4A(AAC)
ffmpeg -i input.mp3 -c:a aac -b:a 192k output.m4a
# FLAC 转 MP3(无损 → 有损)
ffmpeg -i input.flac -c:a libmp3lame -b:a 320k output.mp3
# 任意格式转 WAV(PCM,无损,巨大)
ffmpeg -i input.mp3 output.wav

4.2 从视频中提取音频

# 提取为 MP3(质量中等)
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k audio.mp3
# 提取为 AAC(更小)
ffmpeg -i video.mp4 -vn -c:a aac -b:a 128k audio.m4a
# 提取原始音频流(不编码,直接复制)
ffmpeg -i video.mp4 -vn -c:a copy audio.aac

踩坑:-c:a copy 要求视频里的音频编码格式是你想要的容器支持的。比如 MP4 里的 AAC 可以直接改后缀为 .aac,但 YouTube 下载的 opus 不能直接塞进 MP3 容器。

五、常用滤镜(音频特效)

5.1 音量调节(volume)

# 音量翻倍
ffmpeg -i input.mp3 -af "volume=2.0" output.mp3
# 降低一半
ffmpeg -i input.mp3 -af "volume=0.5" output.mp3
# 用分贝表示(增加 10dB)
ffmpeg -i input.mp3 -af "volume=10dB" output.mp3

5.2 音量归一化(loudnorm / dynaudnorm)
使用 loudnorm(EBU R128 标准,适合统一响度):

ffmpeg -i input.wav -af loudnorm=I=-16:LRA=11:TP=-1.5 output.wav

参数解释:

1、I:整体响度(-16 适合播客,-23 适合电视)
2、LRA:响度范围
3、TP:真峰值上限

使用 dynaudnorm(简单动态音频归一化):

ffmpeg -i input.mp3 -af dynaudnorm output.mp3

踩坑:loudnorm 第一次跑可以加 -af loudnorm=print_format=json 打印分析结果,再用测量值做第二次处理。直接跑可能会让峰值过载。

5.3 淡入淡出(afade)

# 淡入 3 秒
ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=3" output.mp3
# 淡出 5 秒,从第 60 秒开始
ffmpeg -i input.mp3 -af "afade=t=out:st=60:d=5" output.mp3

5.4 降噪(高切 / 低切)
去除低频哼声(高通滤波):

ffmpeg -i input.mp3 -af "highpass=f=80" output.mp3
去除高频嘶声(低通滤波):
bash
ffmpeg -i input.mp3 -af "lowpass=f=3000" output.mp3
更高级的降噪需要 afftdn(FFT 降噪),先采集噪声样本:
bash
# 提取前 0.5 秒作为噪声样本
ffmpeg -i input.wav -ss 0 -t 0.5 noise.wav
# 应用降噪
ffmpeg -i input.wav -i noise.wav -af "afftdn=sn" output.wav

5.5 变速不变调(atempo)

# 加速 20%(1.2 倍速)
ffmpeg -i input.mp3 -af "atempo=1.2" output.mp3
# 减速 20%(0.8 倍速)
ffmpeg -i input.mp3 -af "atempo=0.8" output.mp3
# 变调不变速(rubberband 需要单独编译,一般用 asetrate 会变时长)

踩坑:atempo 范围是 0.5 到 2.0。需要更快的可以链式调用:atempo=2.0,atempo=2.0 实现 4 倍速。

六、实战命令(我每天都用)

6.1 把一段长录音剪出精彩片段(不重新编码)

ffmpeg -i recording.mp3 -ss 00:01:30 -to 00:03:45 -c copy clip.mp3

-c copy 速度飞快但可能切割点不精确(关键帧问题)。如果要求精确到毫秒,去掉 -c copy 重新编码。

6.2 合并多个音频文件
先创建 list.txt:

file 'part1.mp3'
file 'part2.mp3'
file 'part3.mp3'

然后:

ffmpeg -f concat -safe 0 -i list.txt -c copy merged.mp3

踩坑:所有文件的编码格式、采样率、声道数必须一致,否则拼接后有奇怪杂音。可以先用 ffmpeg -i input -ar 44100 -ac 2 统一格式。

6.3 背景音乐 + 人声混合(overlay 音频)
把背景音乐音量降低,和人声混在一起:

ffmpeg -i voice.mp3 -i bgm.mp3 -filter_complex "[1:a]volume=0.3[b];[0:a][b]amix=duration=longest" output.mp3

amix=duration=longest 表示按最长的音频长度混合(不会截断)。

6.4 声道分离与合并
提取左声道(mono):

ffmpeg -i stereo.mp3 -af "pan=mono|c0=c0" left.mp3

把两个单声道合并为一个立体声:

ffmpeg -i left.mp3 -i right.mp3 -filter_complex "[0:a][1:a]amerge" -ac 2 output.mp3

6.5 给音频添加封面图片(做成带封面的 MP3)

ffmpeg -i audio.mp3 -i cover.jpg -map 0:a -map 1:v -c copy -id3v2_version 3 output.mp3

七、问题汇总(全部真实踩过)

  1. 转出来的 MP3 播放器不识别
    原因:可能是 ID3 标签版本问题,或者编码时用了不标准的参数。
    解决:加 -id3v2_version 3 -write_id3v1 1 参数,或者改用 -c:a libmp3lame 明确指定编码器。

  2. 音量归一化后,有些地方反而更小声了
    原因:loudnorm 会整体压缩动态范围,如果原始音频有很响的片段,会把整体拉低。
    解决:先手动剪辑掉过响的段落,或者用 dynaudnorm 替代(动态范围保持更好)。

  3. 合并音频时出现“采样率不一致”错误
    错误信息:[concat @ ...] Input link in1 parameters (sample rate) do not match。
    解决:先统一采样率:

ffmpeg -i input1.mp3 -ar 44100 tmp1.mp3
ffmpeg -i input2.mp3 -ar 44100 tmp2.mp3
# 再合并
  1. 背景音乐和人声混合后,人声发闷
    原因:背景音乐在中频段和人声重叠。
    解决:在背景音乐上做 EQ 衰减中频(1000-4000Hz):
ffmpeg -i voice.wav -i bgm.wav -filter_complex "[1:a]afftfilt=real='re * (1 + 0.5*sin(2*PI*2000*t))'[e];[0:a][e]amix" output.wav

更简单:直接用专业音频软件(Audacity)处理,FFmpeg 的 EQ 不够直观。
5. 从视频提取音频后,时长变短了
原因:视频最后一帧带静音,或者有垃圾数据。
解决:用 ffmpeg -i video.mp4 -vn -c:a copy -map 0:a audio.aac 直接复制不重新编码;如果还短,用 -copyts 保留时间戳。
6. 想把 MP3 转成单声道减少体积,但声音变形
原因:左右声道相位相反,下混时相互抵消。
解决:用 -af "pan=mono|c0=c0+c1" 强制相加而不是取平均。
7. ffmpeg 提示 No such filter: 'loudnorm'
原因:FFmpeg 版本太老(4.x 之前的版本没有 loudnorm)。
解决:升级 FFmpeg 到 4.0 以上,或者用 dynaudnorm 替代。

八、一点小建议

1、处理音频时,尽量先用 WAV 无损格式作为中间文件,避免反复压缩损失质量。最后再转成 MP3/AAC。
2、音量归一化推荐 loudnorm,参数先跑一次分析模式 -af loudnorm=print_format=json,看测量结果再微调。
3、批量处理:写个脚本循环,每个文件单独处理,避免一次性吃太多内存。
4、音视频分离再合并时,注意时间戳对齐。可以先导出音频时间戳 ffprobe 检查。
写这篇的时候我又翻车了:想把一段 5.1 声道的 AC3 转成双声道的 MP3,结果出来的全是杂音。后来发现需要先 -ac 2 下混,再指定编码器。最终命令:

ffmpeg -i 5.1.ac3 -ac 2 -c:a libmp3lame -b:a 192k stereo.mp3

声音终于正常了。

音频处理比视频简单,但细节一样不能错。记住 -c:a、-b:a、-af、-map 就够日常用了。剩下的遇到再查文档,别硬背。

最后推荐一个我的音频转换别名:

alias mp3-to-m4a='for f in *.mp3; do ffmpeg -i "$f" -c:a aac -b:a 128k "${f%.mp3}.m4a"; done'
alias loudnorm-podcast='ffmpeg -i "$1" -af loudnorm=I=-16:LRA=11:TP=-1.5 -ar 44100 -ac 2 "$1"_norm.mp3'

存到 .bashrc 里,省得每次敲一堆参数。

顶部
×
🔖
收藏本站
将本站添加到浏览器书签,方便下次访问
Ctrl + D (Windows/Linux)
+ D (Mac)