Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating movie from python without saving individual frames to files

I would like to create an h264 or divx movie from frames that I generate in a python script in matplotlib. There are about 100k frames in this movie.

In examples on the web [eg. 1], I have only seen the method of saving each frame as a png and then running mencoder or ffmpeg on these files. In my case, saving each frame is impractical. Is there a way to take a plot generated from matplotlib and pipe it directly to ffmpeg, generating no intermediate files?

Programming with ffmpeg's C-api is too difficult for me [eg. 2]. Also, I need an encoding that has good compression such as x264 as the movie file will otherwise be too large for a subsequent step. So it would be great to stick with mencoder/ffmpeg/x264.

Is there something that can be done with pipes [3]?

[1] http://matplotlib.sourceforge.net/examples/animation/movie_demo.html

[2] How does one encode a series of images into H264 using the x264 C API?

[3] http://www.ffmpeg.org/ffmpeg-doc.html#SEC41

like image 965
Paul Avatar asked Nov 04 '10 00:11

Paul


People also ask

How do I save an animation in Python?

To save an animation, we can use Animation. save() or Animation. to_html5_video().


1 Answers

This functionality is now (at least as of 1.2.0, maybe 1.1) baked into matplotlib via the MovieWriter class and it's sub-classes in the animation module. You also need to install ffmpeg in advance.

import matplotlib.animation as animation import numpy as np from pylab import *   dpi = 100  def ani_frame():     fig = plt.figure()     ax = fig.add_subplot(111)     ax.set_aspect('equal')     ax.get_xaxis().set_visible(False)     ax.get_yaxis().set_visible(False)      im = ax.imshow(rand(300,300),cmap='gray',interpolation='nearest')     im.set_clim([0,1])     fig.set_size_inches([5,5])       tight_layout()       def update_img(n):         tmp = rand(300,300)         im.set_data(tmp)         return im      #legend(loc=0)     ani = animation.FuncAnimation(fig,update_img,300,interval=30)     writer = animation.writers['ffmpeg'](fps=30)      ani.save('demo.mp4',writer=writer,dpi=dpi)     return ani 

Documentation for animation

like image 187
tacaswell Avatar answered Sep 22 '22 05:09

tacaswell