我只想用ffmpeg循环播放mp4视频,并保留当前设置和编解码器。
例如,如果input.mp4的长度为0:10,而我想循环播放4次,那么output.mp4的长度为0:40,那么如何更改以下命令行来做到这一点?
ffmpeg -i input.mp4 -c copy output.mp4
我试过了...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
...但是出现错误“找不到选项循环”。
我只想用ffmpeg循环播放mp4视频,并保留当前设置和编解码器。
例如,如果input.mp4的长度为0:10,而我想循环播放4次,那么output.mp4的长度为0:40,那么如何更改以下命令行来做到这一点?
ffmpeg -i input.mp4 -c copy output.mp4
我试过了...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
...但是出现错误“找不到选项循环”。
Answers:
这使您可以循环输入而无需重新编码。
制作一个文本文件。示例文本文件的内容重复4次。
file 'input.mp4'
file 'input.mp4'
file 'input.mp4'
file 'input.mp4'
然后运行ffmpeg
:
ffmpeg -f concat -i list.txt -c copy output.mp4
此示例与上面的示例相同,但是您无需手动进行操作list.txt
:
for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4
使用最常用的现代shell,您甚至可以完全避免创建list.txt
文件。例如,使用bash:
ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4
另请参阅:
使用循环过滤器循环4次的示例,每个循环为75帧,每个循环跳过输入的前25帧:
ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
loop=3:75:25
loop=3
将循环4次。-1
。ffmpeg -h filter=loop
。该电影过滤器具有循环选项。请参阅下面的Monah Tuk的答案。过滤需要重新编码。对于音频,请使用amovie过滤器。
-stream_loop
选项请注意,此选项有问题(请参阅错误报告#5719,#6121和#7043),因此可能不适用于旧版本(任何早于2018 06-27的版本,包括FFmpeg 4.0.x发行分支)。对于旧版本的用户,如mulvya在票证#6121中所述,一种解决方法是先将其重新混合为MKV或TS,然后-stream_loop
在下一个命令中使用。
-loop
选项该-loop
选项特定于图像文件demuxer和gif muxer,因此它不能用于典型的视频文件,但可以用于无限循环一系列输入图像。该示例将反复循环,但是-t 30
将输出持续时间限制为30秒:
ffmpeg -loop 1 -i %03d.png -t 30 output.mkv
或循环输出GIF:
ffmpeg -i input -loop 3 output.gif
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
部分是指向同一张票作为第一个...
至少在FFmpeg 2.8.x上(但oldie也应该起作用),您可以使用lavfi
输入movie
和setpts
过滤器,并使用和过滤器作为-i
option 的参数来使用复杂过滤器图。
下一条命令为您完成这项工作:
ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4
零loop=
参数表示无限循环。大于零的值将设置重复计数。setpts
PTS调整第二和以后重复所需的过滤器,否则大多数输出复用器将因非单调PTS增加而失败:循环不会重新计算PTS。
请注意,使用过滤器假定没有解码/编码的旁路帧是不可能的:根据设计,过滤器仅处理解码的帧。
在FFmpeg 2.8.2中-stream_loop
引入了新的输入选项。首先,我认为它的工作更为简单,并且无需复制即可允许复制内容:
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4
但是它不会重新计算PTS,并且输出文件是错误的。如果添加过滤器来修复PTS(请参阅参考资料setpts
),则也必须将其删除-c copy
。只有比特流过滤器可以处理编码的数据包,但是没有任何比特流过滤器可以修复PTS(请参阅:https : //ffmpeg.org/ffmpeg-bitstream-filters.html)
无论如何,第二遍的ffmpeg都会失败并出现错误:
input.mp4: Resource temporarily unavailable
对我来说已知的解决方法:使用不受PTS限制的输入文件容器(流容器)。众所周知,其中之一就是MPEG-TS。因此,您可以简单地将MP4文件转换为MPEG-TS:
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts
并使用下一个命令组成无限文件:
ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4
(仅在需要时才使用位流过滤器,在我的示例中是必需的)
在这种情况下,需要FFmpeg> = 2.8.2。
-c copy
。答案固定。
对于ffmpeg 2.8.4,以下命令将创建output.mp4,它是input.mp4的重复副本,直到ffmpeg进程停止为止:
ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4
该命令不会自行终止,并且输出文件将无限增长。
问:“ ...如何更改以下命令行来执行此操作?ffmpeg -i input.mp4 -c复制output.mp4”?
答:避免使用哪个命令与哪个版本一起使用的问题的简单方法是“简单的解决方案”:
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c复制output.mp4
另请参见:https : //trac.ffmpeg.org/wiki/Concatenate以获取许多示例。