复杂的音量随ffmpeg而变化

时间:2016-06-28 20:10:34

标签: audio ffmpeg

使用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%的点,以及它逐渐消失到满音量的点)会出现毛刺 - 可听见的声音点击。

2 个答案:

答案 0 :(得分:4)

作为@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

答案 1 :(得分:3)

我打算建议完全使用音量过滤器,但可以通过微小的修改以当前的方式完成。

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

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