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:
- Descomponer el video en imágenes.
- Insertar la marca deseada en cada fotograma (imagenes extraídas del video).
- Volver a construir un nuevo video con los fotogramas modificados.
$ 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,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,
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,
Por último, ahora que ya tenemos los fotogramas nuevos con la imagen inserta, reconstruimos el nuevo video usando FFmpeg,#!/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)
$ 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.