ffmpeg 每 10 秒暂停视频 3 秒

ffmpeg 每 10 秒暂停视频 3 秒

有没有办法使用 ffmpeg 每 10 秒暂停视频 3 秒?

例如,我使用 30 秒的视频,视频应在 0:00、0:10、0:20 和 0:30 处停止 3 秒。输出视频的长度为 0:42 秒。

谢谢你!

答案1

编辑:添加了不同的方法,该方法考虑了音频以及由于初始方法而覆盖的帧,显示在底部。

ffmpeg -i input.mp4 -filter_complex \
       "[0:v]split=4[v0][v1][v2][v3]; \
        [v0]trim=start_frame=0:end_frame=1,loop=90:1:0,setpts=N/FRAME_RATE/TB[0v]; \
        [v1]trim=start_frame=1:end_frame=301,loop=90:1:299,setpts=N/FRAME_RATE/TB[1v]; \
        [v2]trim=start_frame=301:end_frame=601,loop=90:1:299,setpts=N/FRAME_RATE/TB[2v]; \
        [v3]trim=start_frame=601:end_frame=900,loop=90:1:298,setpts=N/FRAME_RATE/TB[3v]; \
        aevalsrc=0:d=3[0a]; \
        [0:a]asplit=3[a1][a2][a3]; \
        [a1]atrim=0:10,asetpts=N/SR/TB[1a]; \
        [a2]atrim=10:20,asetpts=N/SR/TB[2a]; \
        [a3]atrim=20:30,asetpts=N/SR/TB[3a]; \
        [0v][0a][1v][1a][2v][2a][3v][3a]concat=n=4:v=1:a=1[v][a]" \
       -map "[v]" -map "[a]" outva.mp4

这可以通过使用菊花链环路滤波器来实现。

ffmpeg -i input.mp4 \
      -vf loop=90:1:0,setpts=N/FRAME_RATE/TB, \
          loop=90:1:390,setpts=N/FRAME_RATE/TB, \
          loop=90:1:780,setpts=N/FRAME_RATE/TB, \
          loop=90:1:1169,setpts=N/FRAME_RATE/TB
stuttered.mp4

上述命令适用于 30 fps 的视频。每个循环过滤器将循环设置为 90 帧,即 3 秒,30 fps,循环 1 帧片段。第三个参数是必须循环的帧索引。第一个之后的所有循环过滤器的索引都必须偏移,因为它们的输入源包含插入的较早的循环,例如,10 秒的第二个循环通常适用300于 30 fps 的视频,但由于第一个循环已经循环了 3 秒,因此它是3x30 + 10x30 = 390

setpts 在每个循环之后都会生成一组单调的新时间戳,否则命令就无法正常工作。

音频已被完全忽略。

答案2

我创建了一个 Python 脚本来执行此操作:https://github.com/slhck/bufferer— 你可以使用以下命令安装它

pip install bufferer

然后:

bufferer -i input.mp4 -b "[10,3],[20,3],[30,3]" -o output.avi

这将为命令添加一个“重新缓冲”指示器 - 就像一个指示暂停的旋转器。它将插入您指定的暂停,即在原始剪辑的 10、20 和 30 秒处暂停三秒。它将输出具有 FFV1 编码和 PCM 音频的无损视频,但这可以更改。有关README更多信息,请参阅。

我计划添加一项功能来禁用该重新缓冲指示器,因为您可能只想简单暂停一下。与此同时,您可以使用--dry-run开关打印命令,并将其用作一些手动更改的起点。

相关内容