FFMpeg:在视频暂停时,在视频上叠加图像或 gif 持续 X 秒

FFMpeg:在视频暂停时,在视频上叠加图像或 gif 持续 X 秒

我的要求如下:

  1. 输入视频是 MP4
  2. 覆盖可以是 gif 或 png。

叠加应在时间戳处出现在输入视频上。它应持续 5 秒。如果是 gif,它应循环播放 5 秒。在叠加出现的这 5 秒内,背景视频应暂停(音频和视频),然后在叠加消失后恢复。叠加可发生在从第 0 帧到最后一帧的任何位置。

我尝试在某个时间戳处插入图像,计算该时间戳处的帧,然后使用loop,但我遇到了音频或视频中的一个或另一个问题。我还尝试在叠加时将视频分成两部分,应用于其中一部分然后合并它们。

我已经这样做了 3 天,希望有人能帮助我完成命令,因为目前这超出了我的能力范围。

答案1

我花了好几个小时才搞定。@Баяр Гончикжапов 的评论和这个主题的回答很有帮助:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg

您必须在叠加层之前的部分上使用 tpad 滤镜,这样您就可以将该部分的最后一帧暂停任意长的时间。接下来,您填充第 1 部分的音频,以补偿视频暂停并使用 apad 滤镜显示叠加层时的额外时间。

接下来,您联系视频部分 + 音频部分,并在生成的视频上应用叠加。

举个例子,我将使用 30 秒的第 1 部分,然后暂停 5 秒并覆盖,第 2 部分也是 30 秒。

对于 png 图像:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"

对于 gif 图像:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"

相关内容