将第一个视频静音为第二个视频ffmpeg的长度



嘿,伙计们,我正在为ffmpeg制作这个命令,目的是创建2个视频和几个图像的叠加,但现在我需要在播放第二个视频时将第一个视频静音。在ffmpeg中,在一个单一的滤波器复合体中这样做可能吗?不必运行ffmpeg来静音,然后再为覆盖层运行它?

我目前的过滤器复合体,以防它有助于了解我在做什么

-filter_complex 
"[0]crop='min(ih,iw)':'min(ih,iw)':'iw/2':'ih/2'[cropped];
[1]trim=end_frame=1,
geq='st(3,pow(X-(W/2),2)+pow(Y-(H/2),2));if(lte(ld(3),pow(min(W/2,H/2),2)),255,0)':128:128,
setpts=N/FRAME_RATE/TB[mask];
[1][mask]alphamerge[cutout];
[cropped][cutout]overlay=x='{x}':y='{y}'[v];
[0][1]amix=2[a]" 
-map "[v]" 
-map "[a]

非常恢复,我正在寻找的是一种方法,将第一个视频静音为第二个视频的总长度,然后取消静音。

几个想法。这两个你都需要知道叠加的开始和结束时间

  1. 使用asegmentanullsink
-filter_complex 
...
[0]asegment=20[kill][keep]; 
[kill]anullsink; 
[keep]adelay=20000,[1]amix=2[a]" 
  1. 打开第一个视频两次,第一次仅打开视频,第二次仅打开音频

然后在纯音频输入上设置-ss/-t/-to,以仅加载您想听的内容,并使用adelay过滤器使音频在-ss过滤器指定的时间开始。

ffmpeg -an -i video1.mp4 -i video2.mp4 -ss 20 -vn -i video1.mp4 
-filter_complex ...;[2]adelay=20000:1,[1]amix=2[a] 
...

如果video2进入输出视频的中间,则需要为第二个video1音频段添加另一个仅限音频的输入。

2a。使用-f concatconcat

使用这种多次指定输入文件的想法,可以使用各种流串联方法。

  1. 使用asendcmdastreamselect
-filter_complex 
...
asendcmd='[0:a]asendcmd='20 astreamselect map 1',  
[1:a]astreamselect=inputs=2:map=0[a]

Video2放在video1的中间,您需要使用start-stop [enter] ..., [leave] ...命令来处理asendcmd

好奇地想看看其他人是否有更好的解决方案。

最新更新