FFmpeg 音频处理从入门到凑合听:转格式、剪音频、混音、降噪我全记下来了(附 VidDown 工具集介绍)
FFmpeg 音频处理从入门到凑合听:转格式、剪音频、混音、降噪我全记下来了(附 VidDown 工具集介绍)
之前那几篇 FFmpeg 博客都讲视频,这次专门写一篇音频的。起因是上个月做了个播客剪辑的小工具,要把嘉宾的录音降噪、调音量、拼成一条,再加个背景音乐。折腾下来发现 FFmpeg 处理音频比视频简单得多(滤镜少,速度快),但坑也不少——比如音量归一化、多音轨选择、格式兼容性。这篇把常用的音频命令和踩过的坑全记下来。
本文由 VidDown 提供支持—— 一个完全免费、无需登录、纯前端处理的在线工具集。除了技术博客,VidDown 还提供视频解析下载、JSON 格式化、PDF 合并、IP 子网分析、Cron 表达式生成等 20+ 实用功能。
🌐 主站:https://viddown.cn
一、音频处理的基本概念(一句话版)
- 采样率(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:alibmp3lame-b:a音频码率-b:a128k-ar采样率-ar44100-ac声道数-ac1(单声道)-af音频滤镜-af"volume=2.0"-vn不包含视频 提取纯音频-map0:a:0 选第一个输入的第一个音频流 多音轨时用四、基础转换命令
4.1 格式转换(不改变质量)
# MP3 转 M4A(AAC)ffmpeg-iinput.mp3-c:aaac-b:a192k output.m4a# FLAC 转 MP3(无损 → 有损)ffmpeg-iinput.flac-c:alibmp3lame-b:a320k output.mp3# 任意格式转 WAV(PCM,无损,巨大)ffmpeg-iinput.mp3 output.wav4.2 从视频中提取音频
# 提取为 MP3(质量中等)ffmpeg-ivideo.mp4-vn-c:alibmp3lame-b:a192k audio.mp3# 提取为 AAC(更小)ffmpeg-ivideo.mp4-vn-c:aaac-b:a128k audio.m4a# 提取原始音频流(不编码,直接复制)ffmpeg-ivideo.mp4-vn-c:acopy audio.aac踩坑:-c:a copy 要求视频里的音频编码格式是你想要的容器支持的。比如 MP4 里的 AAC 可以直接改后缀为 .aac,但 YouTube 下载的 opus 不能直接塞进 MP3 容器。
五、常用滤镜(音频特效)
5.1 音量调节(volume)
# 音量翻倍ffmpeg-iinput.mp3-af"volume=2.0"output.mp3# 降低一半ffmpeg-iinput.mp3-af"volume=0.5"output.mp3# 用分贝表示(增加 10dB)ffmpeg-iinput.mp3-af"volume=10dB"output.mp35.2 音量归一化(loudnorm / dynaudnorm)
使用 loudnorm(EBU R128 标准,适合统一响度):
ffmpeg-iinput.wav-afloudnorm=I=-16:LRA=11:TP=-1.5 output.wav参数解释:
1、I:整体响度(-16 适合播客,-23 适合电视)
2、LRA:响度范围
3、TP:真峰值上限
使用 dynaudnorm(简单动态音频归一化):
ffmpeg-iinput.mp3-afdynaudnorm output.mp3踩坑:loudnorm 第一次跑可以加 -af loudnorm=print_format=json 打印分析结果,再用测量值做第二次处理。直接跑可能会让峰值过载。
5.3 淡入淡出(afade)
# 淡入 3 秒ffmpeg-iinput.mp3-af"afade=t=in:st=0:d=3"output.mp3# 淡出 5 秒,从第 60 秒开始ffmpeg-iinput.mp3-af"afade=t=out:st=60:d=5"output.mp35.4 降噪(高切 / 低切)
去除低频哼声(高通滤波):
ffmpeg-iinput.mp3-af"highpass=f=80"output.mp3 去除高频嘶声(低通滤波):bashffmpeg-iinput.mp3-af"lowpass=f=3000"output.mp3 更高级的降噪需要 afftdn(FFT 降噪),先采集噪声样本:bash# 提取前 0.5 秒作为噪声样本ffmpeg-iinput.wav-ss0-t0.5noise.wav# 应用降噪ffmpeg-iinput.wav-inoise.wav-af"afftdn=sn"output.wav5.5 变速不变调(atempo)
# 加速 20%(1.2 倍速)ffmpeg-iinput.mp3-af"atempo=1.2"output.mp3# 减速 20%(0.8 倍速)ffmpeg-iinput.mp3-af"atempo=0.8"output.mp3# 变调不变速(rubberband 需要单独编译,一般用 asetrate 会变时长)踩坑:atempo 范围是 0.5 到 2.0。需要更快的可以链式调用:atempo=2.0,atempo=2.0 实现 4 倍速。
六、实战命令(我每天都用)
6.1 把一段长录音剪出精彩片段(不重新编码)
ffmpeg-irecording.mp3-ss00:01:30-to00:03:45-ccopy clip.mp3-c copy 速度飞快但可能切割点不精确(关键帧问题)。如果要求精确到毫秒,去掉 -c copy 重新编码。
6.2 合并多个音频文件
先创建 list.txt:
file 'part1.mp3' file 'part2.mp3' file 'part3.mp3'然后:
ffmpeg-fconcat-safe0-ilist.txt-ccopy merged.mp3踩坑:所有文件的编码格式、采样率、声道数必须一致,否则拼接后有奇怪杂音。可以先用 ffmpeg -i input -ar 44100 -ac 2 统一格式。
6.3 背景音乐 + 人声混合(overlay 音频)
把背景音乐音量降低,和人声混在一起:
ffmpeg-ivoice.mp3-ibgm.mp3-filter_complex"[1:a]volume=0.3[b];[0:a][b]amix=duration=longest"output.mp3amix=duration=longest 表示按最长的音频长度混合(不会截断)。
6.4 声道分离与合并
提取左声道(mono):
ffmpeg-istereo.mp3-af"pan=mono|c0=c0"left.mp3把两个单声道合并为一个立体声:
ffmpeg-ileft.mp3-iright.mp3-filter_complex"[0:a][1:a]amerge"-ac2output.mp36.5 给音频添加封面图片(做成带封面的 MP3)
ffmpeg-iaudio.mp3-icover.jpg-map0:a-map1:v-ccopy-id3v2_version3output.mp3七、问题汇总(全部真实踩过)
转出来的 MP3 播放器不识别
原因:可能是 ID3 标签版本问题,或者编码时用了不标准的参数。
解决:加 -id3v2_version 3 -write_id3v1 1 参数,或者改用 -c:a libmp3lame 明确指定编码器。音量归一化后,有些地方反而更小声了
原因:loudnorm 会整体压缩动态范围,如果原始音频有很响的片段,会把整体拉低。
解决:先手动剪辑掉过响的段落,或者用 dynaudnorm 替代(动态范围保持更好)。合并音频时出现“采样率不一致”错误
错误信息:[concat @ …] Input link in1 parameters (sample rate) do not match。
解决:先统一采样率:
ffmpeg-iinput1.mp3-ar44100tmp1.mp3 ffmpeg-iinput2.mp3-ar44100tmp2.mp3# 再合并- 背景音乐和人声混合后,人声发闷
原因:背景音乐在中频段和人声重叠。
解决:在背景音乐上做 EQ 衰减中频(1000-4000Hz):
ffmpeg-ivoice.wav-ibgm.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 不够直观。
从视频提取音频后,时长变短了
原因:视频最后一帧带静音,或者有垃圾数据。
解决:用 ffmpeg -i video.mp4 -vn -c:a copy -map 0:a audio.aac 直接复制不重新编码;如果还短,用 -copyts 保留时间戳。想把 MP3 转成单声道减少体积,但声音变形
原因:左右声道相位相反,下混时相互抵消。
解决:用 -af “pan=mono|c0=c0+c1” 强制相加而不是取平均。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-i5.1.ac3-ac2-c:alibmp3lame-b:a192k stereo.mp3声音终于正常了。
音频处理比视频简单,但细节一样不能错。记住 -c:a、-b:a、-af、-map 就够日常用了。剩下的遇到再查文档,别硬背。
最后推荐一个我的音频转换别名:
aliasmp3-to-m4a='for f in *.mp3; do ffmpeg -i "$f" -c:a aac -b:a 128k "${f%.mp3}.m4a"; done'aliasloudnorm-podcast='ffmpeg -i "$1" -af loudnorm=I=-16:LRA=11:TP=-1.5 -ar 44100 -ac 2 "$1"_norm.mp3'存到 .bashrc 里,省得每次敲一堆参数。
