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

Mute first video for the length of a second video ffmpeg

大家好,我正在为 ffmpeg 创建此命令,objective 是为了创建 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. 使用asegment and anullsink
-filter_complex \
    ...
    [0]asegment=20[kill][keep]; \
    [kill]anullsink; \
    [keep]adelay=20000,[1]amix=2[a]" 
  1. 打开第一个视频两次,只打开第一个视频,只打开第二个音频。

然后在audio-only输入上设置-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] \
       ...

如果视频 2 进入输出视频的中间,您需要为第二个视频 1 音频片段添加另一个 audio-only 输入。

2a。使用 -f concatconcat

利用多次指定输入文件的思路,可以使用多种stream concatenation方法。

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

Video2放在video1的中间,asendcmd需要用start-stop [enter] ..., [leave] ...命令。

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