用 ffmpeg 给动机录音做响度对齐,我踩到静音段的坑

写歌时我习惯在手机上录动机,一般是弹一段吉他或者哼一段旋律,时长 20 秒到 1 分钟。攒到 40 多条的时候问题来了:在播放器里连着放,有的响得吓人,有的得把音量拧到头。我决定用 ffmpeg 统一处理,版本是 6.0,环境是 macOS,素材是 43 条 m4a,单条 300KB 上下,总量不到 20MB。

做法很简单,先测再调。第一步用 loudnorm 的测量模式拿到每条的真实响度:

for f in *.m4a; do
  ffmpeg -hide_banner -i "$f" -af loudnorm=print_format=json -f null - 2>&1 \
    | sed -n '/^{/,/^}/p' > "${f%.m4a}.json"
done

第二步按目标 -16 LUFS 统一转一遍,我习惯把成品放到 out/ 里,不动原始文件:

mkdir -p out
for f in *.m4a; do
  ffmpeg -hide_banner -y -i "$f" \
    -af loudnorm=I=-16:TP=-1.5:LRA=11 \
    -c:v copy -c:a aac -b:a 192k "out/$f"
done

第三遍再测一次 out/ 里的文件,确认落点。我的 43 条里有 41 条落在了 -16.5 到 -15.7 之间,剩下两条偏了 2 dB 以上,后来是单独手动处理掉的。

为什么用 loudnorm 而不是简单的 volume 增益:动机录音的峰值和平均响度关系每一条都不一样,哼唱那条峰值很尖但整体很虚,光看峰值调会把它压得更虚。loudnorm 是按感知响度来的,代价是它要做两遍分析,而且会限制动态范围——对我这种只求「连着听不跳音量」的素材可以接受,但如果哪天要拿去做混音参考,我就不敢这么干了。

哪里会失效:一是开头或结尾有大段静音的录音。loudnorm 会把静音也算进整体统计,结果把真正有内容的部分推得过高,我有一条前奏留了 8 秒空白的,直接被推到削波边缘,只能先裁掉再跑。二是极短的片段,十几秒以下的,测量结果不稳,同一段跑两次能差 1 dB。三是手机上录的 m4a 有的是可变帧率,-c:v copy 在某些条上会报错,去掉这个参数就好了。还有一点我不太确定:loudnorm 对单声道素材的处理是否和立体声一致,我没做对照测试。

现在我的流程是:先粗听一遍把带长静音的挑出来裁掉,再统一跑。想问一下大家,动机这种半成品素材,你们是按统一响度归档,还是保留原始音量只做标注?

0
赞同度 100% · 0 条评论 · 3 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。