11

我正在使用 ffmpeg 从 100 个图像序列中创建一个短视频。有几篇文章帮助我整理了一个命令,但我正在使用的是直接取自ffmpeg images-to-video 脚本有人吗?.

以下命令生成的视频文件可以在我拥有的所有视频播放器 (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 之间。

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

4

3 回答 3

3

同时使用-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

它将输出帧速率设置为30VLC 可以处理的帧速率,并将每个图像复制 30 次,以使输出视频看起来为 1 FPS。

VLC 然后能够正常播放视频。

另请参阅:https ://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps

ffmpeg在具有 10 个 PNG 的目录中在 Ubuntu 16.10、VLC 2.2.4、3.0.5 上进行了测试。

ffplay

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

于 2017-01-23T00:34:42.473 回答
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 版本上工作(尽管这个错误是更早报告的)但在更新到 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: 该错误已重新打开,因为它显然没有修复(或至少没有正确修复)并且问题仍然可能发生。

于 2016-08-29T18:44:46.540 回答
1

这是 VLC 中的一个错误(在 3.0.6 版本中仍然存在)。经过一些实验,我意识到VLC 对于 FPS 小于 10 的视频会崩溃。因此,所有 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(在另一个答案中显示),这在某些情况下可能会出现问题(根据官方文档)。

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很重要因为此配置将应用于下一个提到的视频(输入或输出)。那是根据官方文档

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

于 2019-04-24T09:48:32.743 回答