FFMPEG,提取第一帧并保持 5 秒

FFMPEG, Extract first frame and hold for 5 seconds

我正在尝试在图像序列的开头叠加一个 15 秒的视频过渡(带有 alpha 的 png 序列以显示下图),我可以使用叠加过滤器很好地完成。但是我想在播放动画之前将图像序列的第一帧保持 5 秒。我试过 trim/select 但我似乎无法将其持续 5 秒,我似乎也无法将它与其他视频连接回去以进行过渡。所以我的问题是:

  1. 如何获取第一帧并将其保持 5 秒,下面的方法有效但似乎不是最干净的选择?

-framerate 30 -t 60.0 -i input1.%04d.jpg -framerate 30 -t 15.0 -i transition1_%03d.png -filter_complex "color=c=red:d=5:s=480x270:r=30[bg]; [bg][1:v]overlay[transhold]; [0:v][transhold]overlay=repeatlast=0[out]"

  1. 在将其叠加到主视频之前,如何将其与原件连接起来,我可以使用下面的命令使用两个叠加层来实现,实际过渡的开始偏移保持长度,但它看起来有点笨拙。

-framerate 30 -t 60.0 -i input1.%04d.jpg -framerate 30 -t 15.0 -i transition1_%03d.png -filter_complex "color=c=red:d=5:s=480x270:r=30[bg]; [1:v]split[trans][transhold]; [trans]setpts=PTS+5/TB[trans];[transhold]select=eq(n[=11=])[transhold];[bg][transhold]overlay[transhold]; [0:v][transhold]overlay=repeatlast=0[tmp1]; [tmp1][trans]overlay[out]"

这是一个更大的命令的一部分,我正在将四个高清图像编译成一个 4k 提要,每个图像都有自己的过渡,所以我可以做得越干净越好。我还希望能够改变不同高清输入的保持时间。如果需要,我可以将第一张图片作为不同的输入,但我仍然需要将它们连接起来。我想一定有办法用过滤器来做到这一点...

另一个 post 回答了这个问题: https://video.stackexchange.com/questions/23551/ffmpeg-extract-first-frame-and-hold-for-5-seconds

-framerate 30 -t 60.0 -i input1.%04d.jpg 
-framerate 30 -t 15.0 -i transition1_%03d.png 
    -filter_complex 
        "[1]loop=149:1:0[trans];
         [0][trans]overlay=eof_action=pass" out.mp4

第二个输入的第一帧重复 149 次,因此有 150 个实例(30 fps x 5s)。循环末尾的 0 是要循环的帧的起始索引。中间的 1 是从第 3 个参数的索引开始循环的帧数。