一个音频在10秒后5秒内逐渐削弱效果
起始目的: 想混合a和b两个音频(重叠), b时长10秒, a时长大于10秒, 在b播放的10秒里a音频音量为30%, b播放完毕后a恢复正常音量100%, 先度娘
参考资料:
得到公式一枚:
volume='if(lt(t,10),1,max(1-(t-10)/5,0))':eval=frame
理解:
lt(t,10)
t=当前秒数
如果当前时间小于10秒, 则返回1, 否则返回0
10秒前
if(1,1,max(1-(t-10)/5,0))
if(x,y,z), 如果x=1 则返回1, 否则返回z
如果小于10秒, volume=1, 否则 volume=z
max(1-(t-10)/5,0)
max(x, y) 返回x和y中的更大的值
t-10
10秒前
0-10=-10
-10/5=-2
1-(-2)=3
1-(-1.8)=2.8
10秒后
11-10=1
1/5=0.2
1-0.2=0.8 -> 11秒
1-0.4=0.6 -> 12秒
1-0.6=0.4 -> 13秒
1-0.8=0.2 -> 14秒
1-1=0 -> 15秒
其中可调参数10=正常时长, 5=削弱时长
volume='if(lt(t,10),1,max(1-(t-10)/5,0))':eval=frame
eval=frame //每经过一帧, 执行一次表达式
所以, 每秒钟的音量值都通过表达式计算结果来动态赋值
初始音量30%,10秒后3秒内逐渐恢复正常音量
t=经过的秒数, 通过时间的变化, 思考表达式
t=10 : (t-10)=0 -> (t-10)/3=0.00 -> 0.3+(t-10)/3*0.7=0.30 -> min(0.3+(t-10)/3*(1-0.3),1)=0.30
t=11 : (t-10)=1 -> (t-10)/3=0.33 -> 0.3+(t-10)/3*0.7=0.53 -> min(0.3+(t-10)/3*(1-0.3),1)=0.53
t=12 : (t-10)=2 -> (t-10)/3=0.66 -> 0.3+(t-10)/3*0.7=0.76 -> min(0.3+(t-10)/3*(1-0.3),1)=0.76
t=13 : (t-10)=3 -> (t-10)/3=0.99 -> 0.3+(t-10)/3*0.7=1.00 -> min(0.3+(t-10)/3*(1-0.3),1)=1.00
t=14 : (t-10)=4 -> (t-10)/3=1.33 -> 0.3+(t-10)/3*0.7=1.23 -> min(0.3+(t-10)/3*(1-0.3),1)=1.00
表达式参考资料:
https://xdsnet.gitbooks.io/other-doc-cn-ffmpeg/content/ffmpeg-doc-cn-08.html
min(x, y) 返回x和y中的更小的值
min(0.3+(t-10)/3*(1-0.3),1) //如果大于1则返回1, 13秒过后保持正常音量播放
1-0.3=0.7 //初始值为0.3 要在0.3的基础往上加
所以
volume='if(lt(t,10),0.3,min(0.3+(t-10)/3*(1-0.3),1))':eval=frame
完整命令
ffmpeg -i 111.aac -af "volume='if(lt(t,10),0.3,min(0.3+(t-10)/3*(1-0.3),1))':eval=frame" 333.aac
使用滤镜混音(叠加):
ffmpeg -i 333.aac -i 444.mp3 -filter_complex amix=inputs=2:dropout_transition=0 555.aac
参考资料
https://xdsnet.gitbooks.io/other-doc-cn-ffmpeg/content/ffmpeg-doc-cn-34.html
音视频合成(无损)
若音频比视频长,画面停留在最后一帧,继续播放声音。
ffmpeg -i 222.mp4 -i 555.aac 666.mp4
单独提取视频(去掉声音)
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
单独提取音频(去掉视频)
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
网友评论