以 1 FPS 的速度将 PNG 帧转换为视频

Ass*_*vie 22 ffmpeg video-encoding

我有 1 FPS 的 PNG 格式视频帧,我正在尝试使用 ffmpeg 将它们转换为视频。

如果我做这样的事情:

ffmpeg -i data/input-%4d.png data/output.mp4

我以 25FPS 获得视频,这基本上是输入的非常快进(以 1FPS 捕获)。

如果我尝试:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

我得到了 VLC 不想玩的东西:)

现在,如果我拍摄第一个视频(FF 视频)并应用过滤器来减慢它的速度(例如-filter:v 'setpts=24.0*PTS'),我可以让它像 1 FPS 视频一样播放,但当然价格是文件大小。我猜它正在生成一堆重复的帧。

所以,问题是我如何创建一个恰好具有 1 FPS 并且实际以该速度播放的视频?顺便说一句,输出格式对我来说并不重要。

小智 20

如果您想要一个单行 FFMPEG 生成每秒 1 帧播放的视频,您想要做的是指定输入和输出的帧率,如下所示:

ffmpeg -r 1 -i 数据/输入-%4d.png -pix_fmt yuv420p -r 10 数据/输出.mp4

-r 1意味着视频将以每秒1 个原始图像的速度播放。
-r 10意味着视频将以每秒 10 帧的速度播放。

(这-pix_fmt yuv420p只是为了确保与各种播放程序的兼容性。例如,这里需要 Windows Media Player 播放视频。)

我测试了许多不同的输出帧率,10 似乎是您可以使用的最低数字,它仍然可以生成 VLC 可以播放的视频。

当然,上面的命令意味着每个原始图像都被相乘,但它比您提到的“放慢速度”更简单,并且根据编解码器,它可能不会产生比真正的 1-FPS 大得多的视频视频。

为了测试这一点,我刚刚制作了一个真正的 1-FPS 视频,结果为 2.24 kiB。然后我制作了一个具有相同输入图像但以 24 FPS 输出的视频,结果为 5.76 kiB。这只是大小的两倍多,远不及大小的 24 倍。:)


Cir*_*郝海东 8

同时使用-framerate-r

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

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Run Code Online (Sandbox Code Playgroud)

这类似于以1 FPS 的速度将 PNG 帧转换为视频 | Unix & Linux Stack Exchange说,但我需要-framerate而不是-r让它工作。

这在维基上提到:http : //trac.ffmpeg.org/wiki/Slideshow#Framerates

它将输出帧率设置为30VLC 可以处理的 ,并复制每个图像 30 次,因此输出视频看起来是 1 FPS。另请参阅:使用 ffmpeg 从图像中播放低 fps 视频的 VLC 中的播放问题 | 堆栈溢出

然后 VLC 就可以正常播放视频了。

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

另见:https : //stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg


slm*_*slm 5

如果您按如下方式稍微增加第二个示例会怎样:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
Run Code Online (Sandbox Code Playgroud)

-r 1需求来的.png文件之前,而不是之后。

FFmpeg 文档

作为一般规则,选项应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后将每次出现应用于下一个输入或输出文件。

  • 不幸的是,这不起作用。但是,提到**顺序很重要** 节省了我很多时间。谢谢。 (2认同)