使用FFmpeg重复视频中的最后一帧

17

您好,我正在尝试将几个2秒长度的mp4剪辑串联起来,这些剪辑使用drawtext过滤器创建,但在此之前,我想通过重复最后一帧来延长其中某些的长度。我该怎么做?

1个回答

41

如果使用的ffmpeg版本是2018年11月2日之后的最新版本,则可以使用以下命令:

ffmpeg -i in.mp4 -vf tpad=stop_mode=clone:stop_duration=2 out.mp4

音频将被忽略。有关旧版本,请参见下面。

默认情况下,覆盖滤镜会在覆盖输入的最后一帧已经结束而基础输入还没有结束时,重复显示覆盖输入的最后一帧。因此,关键是要在完整流上叠加主视频的截断版本,从而“延长”最后一帧。还有一种不同且更简单的方法来完成以上操作:

ffmpeg -i in.mp4 -filter_complex "[0]trim=0:N[hold];[0][hold]concat[extended];[extended][0]overlay" out.mp4

其中N是扩展的持续时间(以秒为单位)。


@vdegenne - 我的解释涵盖了filtergraph的逻辑,但每次都进行机械操作会很麻烦。过滤器的名称是不言自明的,我使用的pad标签也是如此。 - Gyan
@Gyan 好的,谢谢。你能解释一下 ;[extended][0]overlay 的作用吗?因为你已经连接了 [0] 和被修剪的部分 [hold]。这里的叠加是什么意思? - vdegenne
1
裁剪正在修剪视频的前两秒,但 OP 想要重复最后一帧。因此,裁剪+连接的目的是扩展持续时间,但内容错误。叠加依赖于过滤器的行为来提供正确的内容。 - Gyan
我必须在trim命令后添加fifo,否则ffmpeg会报错[Parsed_concat_5 @ 048f7760] Buffer queue overflow, dropping.并且无论修剪长度如何,视频只会延长3秒。但是请准备好足够的RAM(我不得不下载64位版本的ffmpeg,因为32位版本无法分配足够的RAM)。 - Martin Pecka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接