Generar video a partir de imagenes

Hola Gente!!

Que harian si tuvieran que generar un video a partir de las imagenes (que ya estan generadas y en memoria) en python?

Idealmente me gustaria no depender de binarios externos (ffmpeg) … aunque calculo que depender de una lib podria conformarme… o sea lo ideal seria que fuera pure-python en realidad… pero bueno de ultima con una lib podria ser.

Que formato de video? en principio quisiera conseguir h.264… pero un formato mas sencillo tipo… no me acuerdo el nombre de ese que es imagen tras imagen (y que no es gif…) que tiene algo de compresion extra-frame estaria mejor.

Que resolucion necesitaria? No se… no me preocupa tanto la resolucion en cantidad de frames por segundo tampoco… 10 x ejemplo seria super aceptable.

Alguien hizo algo de esto??
Gracias!!
dave

Hola, qué tal?

Más allá de esto qué es lo que querés lograr?

Que soporten animación tenés también mjpg, webp y (a)png.

Salute

1 me gusta

Hola @tenuki! Yo probaría usar moviepy: https://zulko.github.io/moviepy/

Las pocas veces que lo use pude hacer lo que quise en muy poco tiempo sin saber nada al respecto.

1 me gusta

Hola Pardo_bsso! Cuantas consonantes juntas, me hace acordar a css! :smiley:

Hace mucho que quiero generar “video” a partir de imagenes… y ahora hice un scriptcito que genera unas imagenes que son semejantes a un cuadro muy geometrico pero con elementos de azar y queria ir variandolos con el tiempo en un video… no se si me explico…

Si… creo que mjpeg era el formato del que no estoy seguro del nombre… webp lo ubico de nombre y apng no demasiado tampoco.

Finalmente, me gustaria generar video y enviarlo a chromecast…

Hola Humitos!

Hice alguna cosita con moviepy… creo que pegar imagenes y hacer un video de 10 segundos o cosa asi de forma muy facil… eventualmente me gustaria que el algo que use no dependa de opencv… pero ya es demasiado pedir por ahora. :frowning:

Gracias!!

Hola tenuki! Me da curiosidad porqué no querrías depender de un framework multimedia completo y super probado como ffmpeg. Las veces que he tenido que hacer algo parecido simplemente me comuniqué desde Python con el ejecutable en cuestión mediante la biblioteca subprocess.

Si es para evitar el I/O de las imágenes en memoria, quizá podrías ver si te sirve python-vlc tanto para “estremear” los frames como para “castear” directamente al chromecast.

Avisá cuando sea el estreno que me sumo al streaming!

1 me gusta

Hola Manuq! como va??

Ah, me gusta y uso ffmpeg! Pero, a veces me pasa que no necesito algo “perfecto”, optimo y super-compatible y prefiero usar algo como https://github.com/rcarmo/pngcanvas/blob/master/pngcanvas.py por ejemplo para generar un png… no se bien porque. Creo que un motivo es, aunque no vaya a leer toda la especificacion de png, si uso tal o cual parte, poder ver como esta implementada y entenderla mas a fondo. (creo que a todos los que simpatizamos con el open source disfrutamos un poco de eso, no?).

Para compensar tantas palabras, dejo el scriptcito que hace un videito con moviepy… no lo arme de cero… lo saque del ejemplo de la pagina de moviepy y creo que ni lo lei, lo modifique y funciono… no se si esta apestoso el codigo pero funciona… pero si, de vuelta, no quisiera generar files, creo uqe moviepy requiere opencv (!?supongo que por performance para cargar muchos datos y no ocupar demasiada memoria etc… pero no seria mi caso…):

import moviepy.editor as mpy
import gizeh as gz
from math import pi

BLUE = (59/255, 89/255, 152/255)
WHITE = (255, 255, 255)
VIDEO_SIZE = (800, 600)

def render_text(t):
    surface = gz.Surface(640, 60, bg_color=(1, 1, 1))
    text = gz.text("Let's build together", fontfamily="Charter",
                    fontsize=30, fontweight='bold', fill=BLUE, xy=(320, 40))
    text.draw(surface)
    return surface.get_npimage()

text = mpy.VideoClip(render_text, duration=10)

SB_logo_path = 'screenshot.png'
sb_logo = mpy.ImageClip(SB_logo_path).set_position(('center', 0)).resize(width=200)
video = mpy.CompositeVideoClip(
    [
        sb_logo,
        # text.set_position(
        #     ('center', sb_logo.size[1])),
        # stars.set_position(
        #     ('center', sb_logo.size[1] + text.size[1])
        # )
    ],
    size=VIDEO_SIZE).on_color(
        color=WHITE,
        col_opacity=1).set_duration(10)

video.write_videofile('video_with_python.mp4', fps=10)

Saludos!!!

1 me gusta