gentoo linux, java, software libre y otras hierbas
oct, 24 2008 - 6:22 am

Efectos avanzados con hooks con ffmpeg [4ra parte]

Como hemos visto en otras entradas relacionadas con ffmpeg, esta herramienta es bastante útil para realizar una gran cantidad de tareas de edición de video. Sin embargo, aparte de simplemente convertir video o extraer audio, existen otros usos avanzados con el que podemos crear algunos efectos interesantes. En esta entrada aprenderemos a usar algunos de ellos, todos en un solo ejemplo.

Continuando con un ejemplo de otra entrada, en donde poníamos en cámara lenta un video, vamos a agregar un par de efectos. Lo primero será crear una cortina que cubra el video, y posteriormente un par de imágenes moviéndose que simularán un par de luces.

Primer ejemplo – Crear un video estático a partir de una imagen con ffmpeg

Lo primero es crear un video en donde tengamos las cortinas estáticas. Así, usando ésta imagen, el comando sería el siguiente:

ffmpeg -loop_input -i cortina.jpg -t 10 cortina.mpg

Esto creará un video con una imagen estática. La opción -loop_input es imprescindible puesto que el archivo de entrada es una simple imagen, es decir, solo un frame, y por tanto es necesario repetirlo durante el video. La opción -t indica a ffmpeg que el video durará 10 segundos.

Segundo ejemplo – Sobreponer imágenes en movimiento usando hooks

Ahora que tenemos el primer pedazo de nuestro video, vamos a jugar con otro tipo de efecto: movimiento de imágenes. Para ello vamos a ejecutar un comando bastante largo, pero fácil de digerir (eso espero):

ffmpeg -i cortina.mpg -vhook ‘/usr/lib/vhook/imlib2.so -x 100-(40*(sin(N/10))) -y ((H-(1.5*h))*(sin((N/10)+25)))+(h*2/3) -i luces.png’ -vhook ‘/usr/lib/vhook/imlib2.so -x 150+(40*(sin(N/10))) -y ((H-(1.5*h))*(sin((N/15)+45)))+(h*2/3) -i luces.png’ telon.mpg

¡Es todo! ¡Un comando fácil de recordar! Bueno, la verdad no es tan complicado como puede parecer; sin embargo te recomiendo que lo ejecutes por partes:

ffmpeg -i cortina.mpg
-vhook ‘/usr/lib/vhook/imlib2.so
-x 100-(40*(sin(N/10)))
-y ((H-(1.5*h))*(sin((N/10)+25)))+(h*2/3)
-i luces.png’
-vhook ‘/usr/lib/vhook/imlib2.so
-x 150+(40*(sin(N/10)))
-y ((H-(1.5*h))*(sin((N/15)+45)))+(h*2/3)
-i luces.png’ telon.mpg

Explicación del comando anterior…

Ciertamente lo único difícil del comando anterior es el uso de los hooks (-vhook). Sin ellos el comando sería algo así:

ffmpeg -i cortina.mpg telon.mpg

Por lo tanto es importante entender el uso y opciones de los hooks; sino tienes ni idea, puedes leer estos artículos en donde explico claramente qué son y cómo utilizarlos:

Tercer ejemplo – Extraer una imagen a partir de un video

Ahora vamos a extraer el primer frame del video al cual vamos a hacerle el montaje. En mi caso se llama lentas.mpg y lo tomé de una entrada anterior.

ffmpeg -itsoffset 0 -i lentas.mpg -vcodec png -vframes 1 -f rawvideo aun.png

Lo único a resaltar del comando anterior es el uso de la opción -vframes 1, que indica a ffmpeg que vamos a extraer un frame solamente. Luego creamos un video corto con dicha imagen:

ffmpeg -loop_input -i aun.png -t 3 mas_tiempo.mpg

Con el comando anterior creamos un video con una imagen estática, que en el siguiente pasos cubriremos con la cortina en movimiento…

Cuarto ejemplo – Cortina en movimiento (efecto abrir un telón)

En este caso usamos un hook para arrastrar la imagen de la cortina sobre el video que creamos en el paso anterior.

ffmpeg -i mas_tiempo.mpg -vhook ‘/usr/lib/vhook/imlib2.so -x 0 -y (-N*3) -i cortina.jpg’ abre_telon.mpg

Pasos finales

Luego de realizar todos estos pasos, no nos queda mas sino unir los tres pedazos importantes y añadirle audio:

$ cat telon.mpg abre_telon.mpg lentas.mpg > resultado.mpg
$ ffmpeg -i resultado.mpg -i sonido.mp3 final.mpg

El resultado del video…

Descargar archivos usados en el ejemplo

Descargar archivos

11 Comentarios | deja el tuyo

11 Comentarios en “Efectos avanzados con hooks con ffmpeg [4ra parte]”

  1. pablo dice:

    no lo ice pero me gusto el videos de las chiks
    jajaja

  2. noi dice:

    Eso de hacer videos con una imagen no sabia como hacerlo y tenia que usar winbugs! :X

    Que bien que lo hayas puesto! :D

    Saludos

  3. Abraham dice:

    Excelente aporte brother =)

  4. rocket dice:

    hola,
    muy buenos ejemplos… pero tienes alguna formula de vhook para rotar una imagen en un video?

  5. Mancuso dice:

    Hola, quisiera saber sí todo esto como se lo hace en window? Gracias por adelantado.

  6. fernando dice:

    son como lla verga no entiendo nada

  7. gonzalo dice:

    Quiero crear thumb de los videos que subo tengo esto pero no funciona

    <?php

    $video = "video.mp4";
    $time = 3;  
    $image = "image";

    exec("ffmpeg -i {$video} -t 00:00:10 -ss 00:00:10 -vframes 1 {$image}%d.jpg");
                    
    echo " “;
                  
    ?>  

  8. nancy guevara dice:

    muy lindas las boy acer para mi casa y c las embio…… las felicito

  9. eduardo ballesteros dice:

    exelente tutorial, quisiera saber el tiempo que tardo en ejecutar las instruccioines el ffmpeg, tengo un video de 3 min y llevo mas de tres horas y no termina el proceso. mi maquina es un i7,

    gracias le agradesco su colaboracion

    • Cristian dice:

      Creo que estarás ejecutando algo mal… un video de 3 minutos con un core i7 debería tardar en procesar máximo 5 minutos (si fuese HD).

      • Eduardo Ballesteros dice:

        Hola muchas gracias por tu respuesta, te comento mas a fondo, lo que quiero realizar es algo similar a lo que usted esta haciendo “un audio con una imagen estatica”, en tu ejemplo utilizas t=10, pero mi audio “el audio a utilizar es un archivo.aac” tiene una longitud de 227s, cuando utilizo t=10, se ejecuta en aprox un minuto, pero con t=227 pasa mas de una hora y no termina. Estuve buscando algo y mas o menos se soluciono un poco con -vframes pero la verdad desconozco el real uso de este parametro para poder calcularlo.

        Eduardo Ballesteros

¡Déjanos tu comentario!