VLC 冻结从使用 ffmpeg 的图像创建的低 1 FPS 视频

Posted

技术标签:

【中文标题】VLC 冻结从使用 ffmpeg 的图像创建的低 1 FPS 视频【英文标题】:VLC freezes for low 1 FPS video created from images with ffmpeg 【发布时间】:2013-10-16 12:59:27 【问题描述】:

我正在使用 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 张图像,然后仅在帧上冻结。我测试了几种不同的帧速率,似乎在 VLC 中中断视频播放的截止频率介于 1.125 和 1.175 之间。

任何关于我在这里处理的问题的建议将不胜感激。

【问题讨论】:

缺少完整的控制台输出。您可以添加一个输出-r,其值受您的播放器支持。然后 ffmpeg 将复制帧以匹配请求的输出帧速率。 我认为这是vlc中的一个错误......我可以重现这个问题 在制作随时间变化的图表视频时,我遇到了同样的问题。使用 avconf 和 moviepy(使用后端 ffmpeg)测试了 0.5 fps 和 1 fps 与 x264、mpeg4 和 gif。 【参考方案1】:

同时使用-framerate-r

例如,有一个看起来像 1FPS 的最终视频:

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

这在 wiki 上提到: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

在 Ubuntu 16.10、VLC 2.2.4、ffmpeg3.0.5 上测试,在一个包含 10 个 PNG 的目录中。

ffplay

我还会尝试使用来自 ffmpeg 的 ffplay 播放视频,我希望它更强大并且能够处理这样的帧速率。它非常简单,但对于您可能以 2 FPS 使用的测试视频类型来说应该没问题。 TODO 测试一下。

【讨论】:

-framerate和-r有什么区别。从 doc -r rate 表示我认为设置的帧速率(Hz 值、分数或缩写)是相同的。 @Killer 我认为-r 是一帧中的图像数量,-framerate 是一秒钟内的帧数。【参考方案2】:

这是 VLC 中众所周知的错误:https://trac.videolan.org/vlc/ticket/3625 (https://trac.videolan.org/vlc/ticket/214)

许多用户都报告过它有不同的阈值,但根据我自己的发现和体验,阈值大约是几 FPS

目前我很遗憾地看到一个 2 FPS 视频的冻结第一帧,该视频无法在当前版本的 VLC (2.2.4) 中播放 我记得它在一些 1.1.x 版本上工作(尽管这个 bug 被报告得更早)但在更新到 2.x 后它不再对我工作了。

我和我的同事实际上已经将行为与相同的视频文件 (2 FPS) 进行了比较,虽然我可以在 1.1.x 上毫无问题地播放所有这些文件(我认为它是 1.1.1,但我是不再是 100% 确定了),他不能用 2.x 玩它们中的任何一个。 在他将 VLC 降级到 1.1.x 之后,他也可以玩它们了。

因此,如果您迫切需要使用 VLC 并且不会错过 2.x 中的任何内容,那么降级可能是您的选择。否则我会说省去摆弄 VLC 设置的痛苦时间,而只需使用不同的播放器。

更新: 这现在似乎已在 VLC 3.0.4 中得到修复(请参阅https://trac.videolan.org/vlc/ticket/214) 不过我自己没有测试。

更新 #2: 该错误已重新打开,因为它显然没有修复(或至少没有正确修复)并且问题仍然可能发生。

【讨论】:

在使用 VLC 3.0.6 播放低 FPS 视频时仍然遇到问题(任何 FPS 低于 ~10 的视频似乎都会触发该问题)。 @MohammedNoureldin 我想你是对的,我看到错误 #214 已在几周前重新打开.. :(【参考方案3】:

这是 VLC 中的一个错误(在 3.0.6 版本中仍然存在)。经过一些实验后,我意识到 对于 FPS 低于 10 的视频,VLC 会崩溃。因此,所有 10 FPS 或更高的视频都不是问题。因此,目前没有干净的方法来获得可在 VLC 中播放的 1 FPS 视频(不要放弃,继续阅读)。

一种解决方法是 - 如上面的答案所示 - 通过复制图像来伪造 1 FPS 的效果(当我们实际上有 FPS 等于 10 或更高时,这对于 VLC 来说是可以的)。

示例:如果您有一个包含 12 张图片的文件夹,并且您想生成 1 FPS 的视频(可在 VLC 中播放),那么您需要多次复制每张图片(假设 10 次),然后告诉 FFMPEG 生成 10 FPS 视频。这样我们将得到一个总帧数为 120 帧的视频,其中每张图像将播放 1 秒(因为它被复制了 10 次),这只是 1 FPS 的假。

我更喜欢使用fps 参数而不是-r(在另一个答案中显示),这在某些情况下可能会出现问题(根据official documentation)。

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 的顺序很重要,因为此配置将应用于下一个提到的视频(在- 或输出)。那是根据official docs:

选项应用于下一个指定文件。所以,顺序很重要……

【讨论】:

以上是关于VLC 冻结从使用 ffmpeg 的图像创建的低 1 FPS 视频的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 从 C++ 内存中的多个图像流式传输 RTSP

如何使用 VLC 或 FFMPEG 命令行将外部音轨添加到视频文件

基于FFmpeg+rtsp读取摄像头实时图像

使用 ffmpeg libav 和 libx264 从图像创建视频?

linux系统中Nginx+FFmPeg+vlc实现网页视频播放配置过程

在 ffmpeg 中从单个图像创建特定持续时间的视频