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

发布于 2025-01-10 12:14:58 字数 602 浏览 0 评论 0原文

大家好,我正在为 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]

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

Hey guys so I'm making this command for ffmpeg which objective is to create a overlay of 2 videos and a couple images but now I need to mute the first video while the second one is playing. Would this be possible to do in ffmpeg in a single filter complex with out having to run ffmpeg to mute and then run it again for the overlays?

My current filter complex in case it helps understand what im doing

-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]

Very resumed what Im looking for is a way to mute the first video for the total length of the second video and then unmute.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2025-01-17 12:14:58

几个想法。您需要知道叠加的开始和结束时间

  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的中间,需要使用asendcmdstart-stop [enter] ..., [leave] ...命令。

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

A couple ideas. Both of which you need to know the start and end time of the overlay

  1. Use asegment and anullsink
-filter_complex \
    ...
    [0]asegment=20[kill][keep]; \
    [kill]anullsink; \
    [keep]adelay=20000,[1]amix=2[a]" 
  1. Open the first video twice, first video only and second audio only.

Then set -ss/-t/-to on the audio-only input to only load what you want to hear, and use adelay filter to make the audio start at the time specified by -ss filter.

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

If video2 goes into the middle of the output video, you need to add another audio-only input for the second video1 audio segment.

2a. Use -f concat or concat

Using this idea of specifying input file multiple times, you can use various stream concatenation methods.

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

Video2 placed in the middle of video1, you need to use start-stop [enter] ..., [leave] ... command for asendcmd.

Curious to see if others have a better solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文