Insertar una imagen en un video usando ImageMagick y FFmpeg

on


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.

Bloggroll

Páginas vistas en total

Blog Archive