Answers:
编辑:添加了不同的方法,它考虑了音频以及由于初始方法而覆盖的帧,如下所示。
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帧,即以30 fps的速度设置3秒,并使1帧的环路成为循环。第三个参数是必须循环的帧索引。第一个之后的所有环路滤波器的索引必须被偏移,因为它们的输入馈送包含插入的早期循环,例如10秒的第二个循环通常是300
30fps视频,但是因为第一个循环已经循环3秒,它是3x30 + 10x30 = 390
。
setpts在每个循环后生成一组单调的新时间戳,否则命令无法正常工作。
音频已被完全忽略。
我创建了一个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
开关只打印命令,并将其用作某些手动更改的起点。