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

时间:2016-03-15 15:55:43

标签: python video graphics pygame pyglet

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

如果你在网上搜索并最终希望有一个单行代码来做这件事,我担心你在这里找不到这个。但是,这可能会指向正确的方向。

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

我会坚持使用Pyglet,因为它是迄今为止我尝试过的最快的图书馆,也是我的宗教信仰。

pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

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

使用此功能创建一系列索引的屏幕截图:

frame = 0
def on_draw():
    ...
    pyglet.image.get_buffer_manager().get_color_buffer().save(str(frame)+'.png')

完成运行应用程序后,只需使用任何视频编码工具(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

瞧,你应该有一个test.avi你剧照的视频文件 现在有了更好的选择,例如管道视频以ffmpeg每个单独的帧以节省处理时间,但要做到这一点,你需要立即与ffmpeg进行交互,并为此进行交互,例如{{ 3}}