ffmpeg每10秒暂停视频3秒

Fra*_*nky 3 video encoding ffmpeg

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

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

谢谢你!

Gya*_*yan 5

编辑:添加了不同的方法,它解释了音频以及由于初始方法而被覆盖的帧,如底部所示。

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

setpts 在每次循环后生成一组单调的新时间戳,否则该命令将无法正常工作。

音频已被完全忽略。