VLC在播放由ffmpeg创建的低1 FPS图像视频时会卡顿。

12

我正在使用ffmpeg从100张图像序列创建短视频。有几篇文章帮助我组合命令,但我现在正在使用的是直接从ffmpeg images-to-video script anyone?中取出的。

以下命令生成一个视频文件,在所有视频播放器(OS X)中播放良好。

cat input/*.jpg | ffmpeg -f image2pipe -r 10 -vcodec mjpeg -i - out.mp4

但是如果我将它改为

cat input/*.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - out.mp4

它在所有播放器中都可以很好地播放,但是VLC媒体播放器除外。VLC会显示最初的1到3个图像,然后只会停留在当前帧上。我测试了几种不同的帧速率,似乎在1.125和1.175之间有一个断点会导致在VLC中无法播放视频。

如果您有任何关于此问题的建议,将不胜感激。


完整的控制台输出缺失。您可以添加一个输出-r,其值由您的播放器支持。然后,ffmpeg将复制帧以匹配所请求的输出帧速率。 - llogan
我认为这是 VLC 中的一个 bug... 我可以重现这个问题。 - dsign
我在制作一个随时间变化的图表视频时遇到了同样的问题。使用avconf和moviepy(使用后端ffmpeg)测试了0.5 fps和1 fps,使用x264、mpeg4和gif格式。 - Simon Streicher
3个回答

4

同时使用 -framerate-r

例如,要生成最终视频看起来像是1FPS:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

这在维基上有提到:http://trac.ffmpeg.org/wiki/Slideshow#Framerates 它将输出帧率设置为30,VLC可以处理,并将每个图像复制30次,以便输出视频看起来是1 FPS。
然后,VLC可以正常播放视频。
另请参见:https://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps 在一个包含10个PNG文件的目录下,在Ubuntu 16.10中测试过,使用VLC 2.2.4,ffmpeg 3.0.5.
ffplay
我还尝试使用来自ffmpeg的ffplay播放视频,我预计它更加稳健并且可以处理这种帧速率。 它非常简单,但对于您可能要使用的测试视频类型而言应该已经足够了,在2FPS下进行测试。 TODO测试一下。

“-framerate”和“-r”有什么区别?从文档中可以看到,“-r rate”表示设置帧速率(Hz值、分数或缩写),我认为这与“-framerate”相同。 - Shubham AgaRwal
@Killer,我认为-r是一帧中包含多少张图像,-framerate是每秒钟有多少帧。 - Ciro Santilli OurBigBook.com

2
这是VLC中一个早已知道的bug:https://trac.videolan.org/vlc/ticket/3625 (https://trac.videolan.org/vlc/ticket/214)。许多用户报告了不同的阈值,但从我自己的发现和经验来看,阈值在几帧每秒左右。
目前,我很遗憾地看着一个2 FPS的视频的首帧冻结,无法在当前版本的VLC(2.2.4)中播放。我记得它在某个1.1.x版本上能够工作(即使这个bug早在很久以前就被报告了),但是在更新到2.x之后,它对我不再起作用。
我和我的同事实际上曾经比较过完全相同的视频文件(2 FPS)的行为,一段时间以前,当我使用1.1.x时,我可以毫无问题地播放所有视频,而他不能使用2.x播放任何视频。他将VLC降级到1.1.x后,也可以播放它们。
所以,如果你非常想使用VLC并且不会错过2.x的任何东西,那么降级可能是可行的方式。否则,我建议你节省自己费时的调整VLC设置的时间,直接使用其他播放器。
更新:这个问题现在似乎已经在VLC 3.0.4中修复了(请参见https://trac.videolan.org/vlc/ticket/214),但我没有亲自测试过。
更新 #2:该bug已经重新打开,因为显然它没有被修复(或者至少没有被正确地修复),问题仍然存在。

我仍然在使用VLC 3.0.6播放低帧率视频时遇到问题(任何帧率低于约10的视频似乎都会触发该问题)。 - Mohammed Noureldin
1
@MohammedNoureldin,我想你是对的,我看到错误#214在几周前已经重新打开了.. :( - Jiri Valenta

1
这是VLC的一个漏洞(在版本3.0.6中仍然存在)。经过一些实验,我意识到视频FPS小于10时VLC会崩溃。因此,所有10 FPS或更高的视频都不应该有问题。目前没有干净的方法可以获得1 FPS的视频,并且可以在VLC中播放(不要放弃,继续阅读)。
一个解决方法是 - 如上面的答案所示 - 通过复制图像来伪造1 FPS的效果(当实际上我们的FPS等于10或更高时,这对于VLC来说是可以的)。 例如:如果您有一个包含12张图像的文件夹,并且想生成一个1 FPS的视频(可以在VLC中播放),那么您需要将每个图像多次复制(假设为10次),然后告诉FFMPEG生成一个10 FPS的视频。这样,我们将得到一个总帧数为120的视频,在其中每个图像将播放1秒钟(因为它被复制了10次),这只是对1 FPS的伪造。
我更喜欢使用fps参数,而不是另一个答案中提到的-r参数(根据官方文档,在某些情况下可能会出现问题)。
ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

由于输入的 -framerate 小于输出的 fps,FFMPEG 将复制帧以达到所需的输出帧速率(根据上述命令为10)。
同样需要注意的是,-framerate-vf fps 的顺序很重要,因为这个配置将应用于下一个提及的视频(输入或输出)。这是根据官方文档的说明:

选项应用于下一个指定的文件。因此,顺序很重要...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接