使用 python 渲染并保存视频文件

Gio*_*elm 4 python graphics video pygame pyglet

我想使用 python 生成一些正在移动的二维几何对象(圆形、正方形等)的视频。

我怀疑解决方案可能是使用 pygame、piglet 等库进行渲染,然后使用其他库保存屏幕截图并附加到视频文件。

重要的是,我需要在不打开屏幕/窗口的情况下执行此操作;基本上 pyagme 或 Piglet 应该在某个缓冲区而不是屏幕上写入图像。

我使用 matplotlib 取得了一些成功,但我觉得它不是这个项目最合适的工具,特别是如果我想让图形更漂亮并且想要有一些运行速度快的东西。

编辑:我最终使用了 ffmpeg 等命令行工具

Tor*_*xed 8

如果您在网上进行了搜索并最终来到这里希望有一句台词可以做到这一点,那么恐怕您在这里找不到这个。但是,这可能会为您指明正确的方向。

在 pyglet 和大多数 Python GL 库中,您找不到预先创建的 API 来生成视频流,但是它们确实提供了一种获取每个单独帧的原始像素数据的方法。

我会坚持使用 Pyglet,因为它是迄今为止我多年来尝试过的最快的库,而且它是我的信仰。

pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')
Run Code Online (Sandbox Code Playgroud)

此代码不用于保存特定图像,而是用于抓取整个窗口并将其保存到名为screenshot.png.

使用它来创建一系列带索引的屏幕截图:

frame = 0
def on_draw():
    ...
    pyglet.image.get_buffer_manager().get_color_buffer().save(str(frame)+'.png')
Run Code Online (Sandbox Code Playgroud)

运行完应用程序后,只需使用任何视频编码工具(mencoder、ffmpeg、windows movie maker 或 w/e)并将所有静态图像合并到一个视频文件中。

ffmpeg -f image2 -framerate 25 -pattern_type sequence -start_number 0 -r 3 -i %04d.png -s 720x480 test.avi
Run Code Online (Sandbox Code Playgroud)

瞧,您应该有一个test.avi静态照片的视频文件。
现在有更好的替代方案,例如将视频传输到 ffmpeg 每个单独的帧以节省处理时间,但要做到这一点,您需要立即与 ffmpeg 交互,并且有一些库可以实现此目的,例如https://github.com/kanryu/管道mpeg