Editar : método diferente adicionado, responsável pelo áudio e também pelos quadros sobrescritos devido ao método inicial, mostrado na parte inferior.
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
Isso pode ser feito, usando um filtro de loop margarida.
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
O comando acima é para um vídeo de 30 fps. Cada filtro de loop define o loop para 90 quadros, ou seja, 3 segundos a 30 fps com um segmento de 1 quadro a ser em loop. O terceiro argumento é o índice de quadros que deve ser colocado em loop. O índice para todos os filtros de malha após o primeiro tem de ser compensado, uma vez que o seu feed de entrada contém loops anteriores inseridos, e. o segundo loop em 10 segundos normalmente seria 300
para um vídeo de 30 fps, mas como o primeiro foi colocado em loop por 3 segundos, ele é 3x30 + 10x30 = 390
.
Os setpts geram um conjunto monotônico de novos timestamps após cada loop, pois, caso contrário, o comando não funcionará corretamente.
O áudio foi completamente ignorado.