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

Ultrastar Deluxe

El Karaoke para Linux La llegada de la Navidad significa reuniones con familiares y amigos, lo que nos lleva a buscar formas de entretenimiento. Una de ellas es el karaoke , y como no podría ser de otra manera en GNU/Linux tenemos nuestra opción Open Source, se trata de UltraStar Deluxe (para mí la mejor opción), que está basado en el primer Ultrastar aunque bastante más completo y fácil de usar. Esta aplicación es un clon libre de Singstar con el que podrás cantar cualquier canción e incluso crear la tuya propia. Si estáis interesados en instalarlo puedes añadir el repositorio para Ubuntu o bajarlo desde la página oficial en caso de usar otra distribución. sudo add-apt-repository ppa:tobydox/ultrastardx sudo apt-get update sudo apt-get install ultrastar-deluxe Una vez instalado sólo quedará añadir canciones . Como no podía ser de otra manera, existe una comunidad muy activa que nos proporciona gran cantidad de material listo para ser usado, una de ellas es Ultrastar

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

Control PS3 en Debian, Ubuntu

INSTALAR EL CONTROL DE PLAY STATION 3 EN GNU / LINUX. EN LAS DISTRIBUCIONES DEBIAN 6.0 SQUEEZE, DEBIAN WHEEZY (TESTING), LINUX MINT DEBIAN EDITION, LINUX MINT, GUADALINEX, UBUNTU. Les voy a decir como conectar su control de Play Station 3 en Debian por medio de un cable USB, personalmente lo he probado en Debian 6.0 Squeeze (estable) y Debian Wheezy (testing), no lo he probado en Linux Mint Debian Edition (LMDE), pero no tendría porque no funcionar. En el caso de Ubuntu y sus derivadas supongo que también debería funcionar, no lo he probado porque no uso dicha distro, pero los comandos los tome de un tutorial para ella, no es “copy and paste” , solo copie los comandos, el resto es de mi experiencia personal. NOTA PARA USUARIOS DE LINUX MINT, GUADALINEX Y UBUNTU: Los comandos que voy a poner son para Debian y Linux Mint Debian Editon, para el caso de Ubuntu y derivados ya saben que los comandos como root se ejecutan con “sudo”. Además creo q