I want to use python to generate a video of some 2d geometric objects (circles, squares, ...) that are moving around.
I suspect the solution could be using a library like pygame, piglet for the render and then save screenshot and append to video file using some other library.
Importantly I need to do this without having a screen/window opened; basically pyagme or piglet should write an image on some buffer instead of screen.
I had some success using matplotlib, but I feel like it is not the most appropriate tool for this project, especially if I want to make the graphics more fancy and want to have something that runs fast.
EDIT:
I ended up using command line tools like ffmpeg
解决方案
If you made a search online and ended up here hoping for a one-liner to do this, I'm afraid you won't find this here. However, this might point you in the right direction.
In pyglet, and most of the GL libraries for Python you won't find a pre-created API to generate video streams, however they do however provide a way to get the raw pixel data of each individual frame.
I'll stick to Pyglet because it's by far the fastest library I've tried over the yers and It's my religion.
pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')
This code is not used to save a specific image, rather it's used to grab the entire window and save it to a file called screenshot.png.
Use this to create a indexed series of screenshots:
frame = 0
def on_draw():
...
pyglet.image.get_buffer_manager().get_color_buffer().save(str(frame)+'.png')
Once you're done running your application simply use any video encoding tool (mencoder, ffmpeg, windows movie maker or w/e) and combine all the stills into a video file.
ffmpeg -f image2 -framerate 25 -pattern_type sequence -start_number 0 -r 3 -i %04d.png -s 720x480 test.avi
And voila, you should have a test.avi video file of your stills.
Now there's better alternatives, such as to pipe the video to ffmpeg each individual frame to save processing time, but to do this you need to interact with ffmpeg right away and there's libraries for this such as https://github.com/kanryu/pipeffmpeg