Me gustaría crear una película h264 o divx a partir de fotogramas que genero en una secuencia de comandos python en matplotlib. Hay alrededor de 100k cuadros en esta película.Generación de película desde python sin guardar fotogramas individuales en archivos
En ejemplos en la web [ej. 1], solo he visto el método de guardar cada cuadro como png y luego ejecutar mencoder o ffmpeg en estos archivos. En mi caso, guardar cada fotograma no es práctico. ¿Hay alguna manera de tomar un diagrama generado de matplotlib y canalizarlo directamente a ffmpeg, sin generar archivos intermedios?
La programación con C-api de ffmpeg es demasiado difícil para mí [por ej. 2]. Además, necesito una codificación que tenga buena compresión, como x264, ya que de lo contrario el archivo de película será demasiado grande para un paso posterior. Así que sería genial seguir con mencoder/ffmpeg/x264.
¿Hay algo que se pueda hacer con las tuberías [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
todavía tengo que encontrar una manera de hacer esto con las bibliotecas actualmente mantenidos ... (utilicé pymedia en el pasado, pero ya no es mantenida, y no construir sobre cualquier sistema que utilizo .. .) Si ayuda, puede obtener un buffer RGB de una figura matplotlib usando 'buffer = fig.canvas.tostring_rgb()', y el ancho y alto de la figura en píxeles con 'fig.canvas.get_width_height()' (o 'fig.bbox.width', etc.) –
OK, gracias. Eso es útil. Me pregunto si alguna transformación del buffer puede ser canalizada a ffmpeg. pyffmpeg tiene un sofisticado envoltorio Cython, recientemente actualizado, para leer un avi cuadro por cuadro. Pero no escribiendo Eso suena como un posible lugar para comenzar para alguien familiarizado con la biblioteca ffmpeg. Incluso algo como im2frame de matlab sería genial. – Paul
Estoy jugando con la lectura de ffmpeg desde un conducto de entrada (con la opción '-f image2pipe' para que espere una serie de imágenes), o desde un socket local (por ejemplo,' udp: // localhost: some_port') y escribir en el zócalo en python ... Hasta ahora, solo el éxito parcial ... Siento que estoy casi allí, aunque ... No estoy lo suficientemente familiarizado con ffmpeg ... –