Это действительно отличные ответы. Вот еще одно предложение. @ user621442 правильно, что узким местом обычно является запись изображения, поэтому, если вы записываете файлы png в ваш видео компрессор, это будет довольно медленно (даже если вы отправляете их по каналу вместо записи на диск). Я нашел решение, используя чистый ffmpeg, который лично мне проще в использовании, чем matplotlib.animation или mencoder.
Кроме того, в моем случае я хотел просто сохранить изображение по оси, а не сохранять все метки галочек, заголовок рисунка, фон рисунка и т. Д. В основном я хотел сделать фильм / анимацию с использованием кода matplotlib но не иметь его "выглядеть как график". Я включил этот код здесь, но вы можете создавать стандартные графики и вместо этого передавать их в ffmpeg.
import matplotlib.pyplot as plt
import subprocess
# create a figure window that is the exact size of the image
# 400x500 pixels in my case
# don't draw any axis stuff ... thanks to @Joe Kington for this trick
# https://stackoverflow.com/questions/14908576/how-to-remove-frame-from-matplotlib-pyplot-figure-vs-matplotlib-figure-frame
f = plt.figure(frameon=False, figsize=(4, 5), dpi=100)
canvas_width, canvas_height = f.canvas.get_width_height()
ax = f.add_axes([0, 0, 1, 1])
ax.axis('off')
def update(frame):
# your matplotlib code goes here
# Open an ffmpeg process
outf = 'ffmpeg.mp4'
cmdstring = ('ffmpeg',
'-y', '-r', '30', # overwrite, 30fps
'-s', '%dx%d' % (canvas_width, canvas_height), # size of image string
'-pix_fmt', 'argb', # format
'-f', 'rawvideo', '-i', '-', # tell ffmpeg to expect raw video from the pipe
'-vcodec', 'mpeg4', outf) # output encoding
p = subprocess.Popen(cmdstring, stdin=subprocess.PIPE)
# Draw 1000 frames and write to the pipe
for frame in range(1000):
# draw the frame
update(frame)
plt.draw()
# extract the image as an ARGB string
string = f.canvas.tostring_argb()
# write to pipe
p.stdin.write(string)
# Finish up
p.communicate()