使用 ffmpeg 更改复杂的音频音量

coc*_*oco 4 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
Run Code Online (Sandbox Code Playgroud)

这能做到吗?我尝试过的组合(淡化和音量,以及使用时间线编辑)到目前为止还没有成功。

这是接近的事情:

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
Run Code Online (Sandbox Code Playgroud)

.. 但是在中间的两个点(它淡出到 25% 的点和它淡入到最大音量的点)有小故障 - 可听到的声音咔嗒声。

Gya*_*yan 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
Run Code Online (Sandbox Code Playgroud)

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


coc*_*oco 6

作为@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
Run Code Online (Sandbox Code Playgroud)