使用ffmpeg进行复杂音频音量变化

7
使用 ffmpeg,我们对音频水平有多少控制权?例如,我想在程序的时间轴上映射一个“M”形:
t0 - t1 : fade in from 0 to 1
t1 - t2 : play at full volume
t2 - t3 : fade out to 25%
t3 - t4 : play at 25% volume
t4 - t5 : fade in (from 25%) to full volume
t5 - t6 : play at full volume
t6 - t7 : fade out from 1 to 0

这个能做到吗?我已经尝试了淡入淡出和音量的组合,以及使用时间轴编辑,但目前为止都没有成功。

这里有一个接近的例子:

ina="infile.caf"
out="outfile.mp3"

time ffmpeg -i $ina -af \
"afade=enable='between(t,0,3)':t=in:ss=0:d=3, \
afade=enable='between(t,7,8)':t=out:st=7:d=1, \
volume=enable='between(t,8,12)':volume=.25:eval=frame, \
afade=enable='between(t,12,13)':t=in:st=12:d=1, \
afade=enable='between(t,15,18)':t=out:st=15:d=3" \
$out

.. 但在两个中间点(淡出到25%和淡入到全音量时)会出现故障 - 可听到声音的点击。


你尝试了哪个命令? - Gyan
@Mulvya,我添加了一个示例,这是我一直在尝试的。它接近,但还不够好。 - coco
淡入淡出滤镜从零开始或到达零。您应该完全使用音量滤镜来完成它。我很快会提供答案。 - Gyan
2个回答

8
作为对 @Mulvya 回答的替代方案,这里提供一种使用 volume 过滤器产生相同输出的方法。
infile="infile.caf"
outfile="outfile.mp3"

ffmpeg -i $ina -af \
"volume=enable='between(t,0,3)':volume='t / 3.0':eval=frame, \
volume=enable='between(t,3,7)':volume='1':eval=frame, \
volume=enable='between(t,7,8)':volume='1 - 0.75 * (t - 7)':eval=frame, \
volume=enable='between(t,8,12)':volume='0.25':eval=frame, \
volume=enable='between(t,12,13)':volume='.25 + 0.75 * (t - 12)':eval=frame, \
volume=enable='between(t,13,15)':volume='1':eval=frame, \
volume=enable='between(t,15,18)':volume='1 - (t - 15) / 3.0':eval=frame" \
$out

6

我本来想建议完全使用音量过滤器来完成,但是现在可以通过轻微的修改以当前的方式完成。

ffmpeg -i $ina -af \
"afade=enable='between(t,0,3)':t=in:ss=0:d=3, \
afade=enable='between(t,7,8)':t=out:st=7:d=1.333, \
volume=enable='between(t,8,12)':volume=.25:eval=frame, \
afade=enable='between(t,12,13)':t=in:st=11.6667:d=1.333, \
afade=enable='between(t,15,18)':t=out:st=15:d=3" \
$out

淡入滤镜从零开始或到达零,所以诀窍是设置淡入的起始时间、持续时间和启用范围,使得在范围的开始和结束时间时音量达到所需的水平。默认曲线是线性的,因此计算应该很简单。


是的,那个效果非常好。我想,即使在afade上有不同的曲线,也可以找到插入点使其看起来平滑。但我必须承认,我很期待看到如何仅使用volume过滤器来完成它!如果音量路径变得更加复杂,我想知道是否可以通过这种方式获得更多控制。 - coco
好的,举个例子。这是淡出到25%并带有音量的代码:volume=enable='between(t,7,8)':volume='1 - 0.75 * (t - 7)':eval=frame - Gyan
太棒了!我之前在链接“音量”过滤器时遇到了问题,但是现在解决了。我会按照你的方法,使用“音量”来写出我的解决方案。谢谢! - coco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接