使用 ffmpeg 循环播放整个剪辑而不计算帧数

使用 ffmpeg 循环播放整个剪辑而不计算帧数

假设我有一段视频,我想循环播放 5 次。该视频时长 5 秒,帧率为 25 FPS(假设没有音频)。

我可以

ffmpeg -i video.mp4 -vf "loop=4:125,setpts=N/FRAME_RATE/TB" out.mp4

但是,我需要计算视频的长度为 125 帧。有没有办法可以循环播放整个视频而不指定帧数(也许使用一些常量)?我想使用循环过滤器,因为我在更复杂的设置中使用它,计算我需要的帧数似乎是一项应该由计算机完成的工作 :-)。

根据要求,我正在运行的实际命令是这样的:


a1=0 ; a2=2.24 ; b1=1107.12 ; b2=1140.68 ; c1=2.28 ; c2=92.04  \
ffmpeg -i video.mp4 \
       -filter_complex "[0:v]split=3[v0][v1][v2]; \
            [v0]trim=$a1:$a2,setpts=PTS-STARTPTS[v00]; \
            [v1]trim=$c1:$c2,setpts=PTS-STARTPTS[v11]; \
            [v2]trim=$b1:$b2,setpts=PTS-STARTPTS[v22]; \
            [v00]split=3[va][vb][vc]; \
            [va][v11][vb][v22]concat=n=4[v9]; \
            [v9]loop=7:3195,setpts=N/FRAME_RATE/TB[vl]; \
            [vl][vc]concat=n=2[vout0]; \
            [0:a]asplit=3[a0][a1][a2]; \
            [a0]atrim=$a1:$a2,asetpts=PTS-STARTPTS[a00]; \
            [a1]atrim=$c1:$c2,asetpts=PTS-STARTPTS[a11]; \
            [a2]atrim=$b1:$b2,asetpts=PTS-STARTPTS[a22]; \
            [a00]asplit=3[aa][ab][ac]; \
            [aa][a11][ab][a22]concat=n=4:v=0:a=1[a9]; \
            [a9]aloop=7:size=6134400,asetpts=N/SR/TB[al]; \
            [al][ac]concat=n=2:v=0:a=1[aout0]"   -map '[vout0]' -map '[aout0]' -c:v libx264  -preset slow -crf 16 -movflags faststart -y 2.mp4

答案1

您只需使用stream_loop开关输入即可循环,无需任何计算:

ffmpeg -stream_loop 4 -i input.mp4 output.mp4

主要选项

-stream_loop 数字(输入) 设置输入流循环的次数。循环 0 表示不循环,循环 -1 表示无限循环。

还要回答是否有任何 const/var 可用于loop过滤器 - 截至目前,这似乎是不可能的。文档没有列出任何内容,也没有任何内容代码尺寸定义为大于或等于的整数0

相关内容