使用ffmpeg重复/循环输入视频?


52

我只想用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

...但是出现错误“找不到选项循环”。


使用quicktime 7 pro和mov容器。因此,与使用开放源代码相比,您不会获得更大的文件大小。
ДмитрийМышков

Answers:


69

Concat多路分配器

这使您可以循环输入而无需重新编码。

  1. 制作一个文本文件。示例文本文件的内容重复4次。

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. 然后运行ffmpeg

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

对于Linux用户

此示例与上面的示例相同,但是您无需手动进行操作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
  • 您必须列出要循环播放的帧数(在上例中显示为75)。最大值为32767。
  • 另请参阅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选项特定于图像文件demuxergif muxer,因此它不能用于典型的视频文件,但可以用于无限循环一系列输入图像。该示例将反复循环,但是-t 30将输出持续时间限制为30秒:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

或循环输出GIF:

ffmpeg -i input -loop 3 output.gif

这对mp4文件有效吗?
托马斯·金

3
我收到此错误> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11 2015年

1
@jamesfzhang-我认为这是因为您需要文件的绝对路径(如此处所述:trac.ffmpeg.org/wiki/Concatenate)。为此,您可以编写:ffmpeg -safe 0 -f concat -i <(对于{1..4}中的i;执行printf“ file'$ PWD'/'%s'\ n” input.mp4;完成)-c copy output.mp4
Plenus Franckly

1
对于我来说,这可以重复播放全时视频,而无需四次跳过成名ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad

这个问题是4岁和没有人注意到,在链接到第二个问题-stream_loop部分是指向同一张票作为第一个...
列昂尼德·乌索夫

15

至少在FFmpeg 2.8.x上(但oldie也应该起作用),您可以使用lavfi输入moviesetpts过滤器,并使用和过滤器作为-ioption 的参数来使用复杂过滤器图。

下一条命令为您完成这项工作:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

loop=参数表示无限循环。大于零的值将设置重复计数。setptsPTS调整第二和以后重复所需的过滤器,否则大多数输出​​复用器将因非单调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。


1
运行该命令给我错误:“ [mp4 @ 00000000053fa1a0]在流#0中找不到编解码器rawvideo的标签,容器当前不支持编解码器”。如果在输入之前添加-vcodec h264,该错误将消失,但编码器不会退出。提供非零的循环计数会产生很多错误,但是会退出。该文件不是有效的输出。
吉安2015年

1
stream_loop的文档说:“循环0表示无循环,循环-1表示无限循环。”
Gyan 2015年

似乎输入文件不正确。您可以分享吗?“循环0表示无循环,循环-1表示无限循环。” -似乎我看到了旧文档:-)
Monah Tuk

1
我忘了:假定转码(解码/编码)的过滤器。通过设计。因此,您必须删除-c copy。答案固定。
Monah Tuk

1
很高兴知道,但是如果您要生成一个大的循环,这是一个很大的限制。
Gyan 2015年

14

对于ffmpeg 2.8.4,以下命令将创建output.mp4,它是input.mp4的重复副本,直到ffmpeg进程停止为止:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

该命令不会自行终止,并且输出文件将无限增长。


2
似乎是最快的方法
josef

2
最快的方法是轻描淡写,这种方法可以在几秒钟内将长达数小时的视频放大。
SleighBoy

这是一种非常方便的方法,因为不需要创建带有重复行的文件。
Markus Zeller

-1

问:“ ...如何更改以下命令行来执行此操作?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以获取许多示例。


2
这不会进行任何串联。必须至少使用一种concat方法:协议,过滤器或解复用器。在此命令中,ffmpeg的自动映射将从输入中选择一个视频,一个音频和一个字幕流。由于它们相同,因此等效于OP的第一个命令。
Gyan

感谢您测试Mulvya,因为它与文档中描述的行为不同:ffmpeg.org/ffmpeg.html#Description-如果文件名使用“ -i -i / i /tmp/test%d.mp4”(等人)也是可能的。
罗布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.