Ir al contenido principal

Insertar una imagen en un video usando ImageMagick y FFmpeg


Hace unos días me ha surgido la necesidad de insertar una linea horizontal dentro de un video. Al parecer sencillo, sólo debía insertar una linea de color negro que mostrara una determinada altura. Lo primero que hice fue ir a google y preguntarle que sabía sobre esto.
Luego de investigar un poco y descartando la infinidad de programas comerciales que permiten hacer esto y muchas otras cosas, he dado con un plugin de FFmpeg. Lo podéis mirar en este interesante link. A pesar de que esta solución es justo lo que estaba buscando, no he logrado instalar el plugin VHOOK en Ubuntu 9.04 y tampoco en Snow Leopard. Aunque en algunos linux al parecer sí funciona, como se puede ver en este video.
Antes de darme por vencido, se me ha ocurrido una forma alternativa de conseguir lo que quería. Esta solución se compone de 3 pasos:

  1. Descomponer el video en imágenes.
  2. Insertar la marca deseada en cada fotograma (imagenes extraídas del video).
  3. Volver a construir un nuevo video con los fotogramas modificados.
Para los pasos 1 y 3 usaremos FFmpeg, y para el paso 2 usamos ImageMagick. Lo primero que debemos hacer es consultar la información del video, en mi caso un fichero con formato avi. Para ello usamos el comando file,
$ file video.avi
video.avi: RIFF (little-endian) data, AVI, 704 x 576, 25.00 fps, video: FFMpeg MPEG-4
De aquí rescatamos el tamaño del video: 704 x 576 y la cantidad de imágenes por segundo: 25 fps. Lo misma información se consigue abriendo el video desde una consola con el comando mplayer.
Ahora transformamos este video a una secuencia de imágenes usando el comando ffmpeg,
$ ffmpeg -i video.avi -r 25 -ss 00:00:00 -t 00:01:00 -f image2 fotograma-%05d.png
Usando las opciones: “-r 25″ para indicar que extraeremos 25 fps, “-ss 00:00:00″ para indicar el instante de comienzo, “-t 00:01:00″ para indicar que sólo cogeremos 1 minuto del video a partir del instante de comienzo, “-f image2″ para indicar que la salida será en imágenes, y por último, escribo el formato en cual se crearán estas imágenes: fotograma-00001.png, fotograma-00002.png, fotograma-00003.png, etc. En este caso se crearan 1500 imágenes (1 min * 60 seg/min * 25 fps ).
Ahora que ya tenemos las imágenes extraídas del video, con la ayuda del comando composite (ImageMagik) combinamos cada fotograma con la imagen que queremos introducir en el video y la guardamos en una imagen nueva,
$ composite -dissolve 100% -gravity south wm.png fotograma-00001.png newFotograma-00001.png
La opción “-dissolve 100%” nos permite introducir el efecto de transparencia sobre la imagen que se combina con el fotograma. Este comando está pensado mas bien para introducir una marca de agua digital a una imagen, aunque para mi propósito está perfecto. He creado la imagen “wm.png” que contiene las marcas que quiero insertar en el video usando Gimp,
Crear nuevo fichero en Gimp
Crear nuevo fichero en Gimp
basándome en las dimensiones del video (704×576) y con fondo transparente. Ahora inserto las marcas deseadas en esta imagen (“wm.png”), la cual usaré para combinar con los fotogramas extraídos del video. El resultado en mi caso es el siguiente,
Imagen con logo y linea horizontal (704×576).
Imagen con logo y linea horizontal (704×576).
Fotograma original (704x576).
Fotograma original (704x576).
Fotograma modificado (704x576).
Fotograma modificado (704x576).
La primera es la imagen “wm.png” con fondo transparente, la segunda es la imagen “fotograma-00001.png” original y la tercera es el resultado de combinar la primera con la segunda y que he llamado “newfotograma-00001.png”.
Ahora debemos repetir este procedimiento en todos los fotogramas, que por supuesto no haremos de forma manual sino a través del siguiente script en python,
#!/usr/bin/env python
# python script
#
import commands as cmd

list = cmd.getoutput('ls fotograma-*.png').split()
command = 'composite -dissolve 100% -gravity south wm.png'

for i in list:
cmd.getoutput(command+' '+i+' new'+i)
Por último, ahora que ya tenemos los fotogramas nuevos con la imagen inserta, reconstruimos el nuevo video usando FFmpeg,
$ ffmpeg -r 25 -b 5000k -i newfotograma-%5d.png video.mpg
Con las opciones “-r 25″ para usar 25 fps y “-b 5000k” que nos asegura una alta calidad en el video conseguido. Lo cierto es que no entiendo muy bien como saber de antemano que valor dar a la opción “-b” (de bitrate) para conseguir cierta calidad deseada. Como esta variable define la calidad del video, entiendo que usando un valor alto obtengo mayor calidad, y por el contrario, una calidad inferior con un valor bajo. Ahora, cuál es el valor mínimo a usar para no perder calidad? Como calculo ese valor? Lo dejo para que alguien me responda con algún comentario.
Pongo aquí el video original y el modificado,


Nota: Es obvio que este procedimiento para insertar una imagen en un video sólo es apropiado si nuestro video a editar es de corta duración, puesto que la cantidad de imágenes que tendrías que procesar para el caso de una película de 120 minutos… ni lo pienses (180000 imágenes, 0.5M por cada imagen original y modificada, 180 G de imágenes). Seguro que para este caso hay programas muy sofisticados que hacen ediciones muy avanzadas y sin usar muchos recursos.

Entradas populares de este blog

Fallo al obtener la lista de compartición del servidor

 - Ubuntu Karmic Koala El problema. El detalle es que a veces tengo que revisar archivos que están en otras computadoras que utilizan windows. Al momento de darle en el menú Lugares - Red - Red de Windows y al elegir el grupo de trabajo en el que están mis equipos me aparece el siguiente error. No se puede montar el lugar. Fallo al obtener la lista de compartición del servidor. La solución . La encontré en este articulo de los Foros de Ubuntu, lo voy a copiar tal cual, espero que no le moleste al autor y solo a manera de respaldo. # — Aquí inicia el articulo de los foros de Ubuntu – 1- En principio es necesario que estén instalados: samba samba-common smbclient winbind   2- Luego editar el archivo /etc/samba/smb.conf sudo gedit /etc/samba/smb.conf   A los cambios necesarios para adaptar el sistema, según los tutoriales de samba es necesario tener presente que: a- Donde dice workgroup = WORKGROUP, reemplazar WORKGROUP por el nombre de grupo de ...

Descargar Packet Tracer 5.2 [Windows y Linux]

Packet Tracer 5.2 [Windows y Linux] Packet Tracer es la herramienta de aprendizaje y simulación de redes interactiva para los instructores y alumnos de Cisco CCNA. Esta herramienta les permite a los usuarios crear topologías de red, configurar dispositivos, insertar paquetes y simular una red con múltiples representaciones visuales. Packet Tracer se enfoca en apoyar mejor los protocolos de redes que se enseñan en el currículum de CCNA. Este producto tiene el propósito de ser usado como un producto educativo que brinda exposición a la interfaz comando – línea de los dispositivos de Cisco para practicar y aprender por descubrimiento. Packet Tracer 5.2 es la última versión del simulador de redes de Cisco Systems, herramienta fundamental si el alumno está cursando el CCNA o se dedica al networking. En este programa se crea la topología física de la red simplemente arrastrando los dispositivos a la pantalla. Luego clickando en ellos se puede ingresar ...

Mensaje de bienvenida en la Consola

Es una pequeña utilidad para mostrar texto ASCII en la consola. Se llama Figlet y la podemos instalar en Ubuntu con “sudo apt-get install figlet”. Podemos hacer que aparezca un mensaje de bienvenida en la consola si añadimos estas lineas al archivo “$HOME/.bashrc”: #Mensaje figlet “Texto Que quieras $USER”