Hacer un vídeo de fotografías en un minuto desde el terminal

Al contrario de lo que puedas pensar, no soy de los que machacan a sus visitas con reportajes fotográficos o videos de sus viajes, celebraciones o acontecimientos. Es mas, no me gusta que en un visita me pongan a mi el video o el reportaje, realmente es algo que me molesta profundamente. Es más, raramente veo las fotografías que hago, salvo cuando tengo que escribir un artículo como el presente.

Pero probablemente, yo sea un bicho raro. Hay mucha gente que disfruta, tanto poniéndo el vídeo como viéndolo, según el caso. Sin embargo, sucede que como vamos como vamos, montar un vídeo se puede convertir en un trabajo realmente tedioso, o que simplemente no queremos gastar ese tiempo en hacer el vídeo, preferimos dedicarlo a otras cosas.

La ventaja de GNU/Linux, es que hay herramientas verdaderamente potentes. Normalmente conocemos algunos usos de ellas, o simplemente desconocemos que existan, pero están ahí, y en un momento te pueden sacar de un apuro.

Haciendo el vídeo

Codificando las imágenes

El vídeo lo voy a montar de un conjunto de fotografías todas en formato JPEG. Se trata de 159 imágenes, y teniendo en cuenta que mi archivo de audio es de 8 minutos, cada imagen tiene que estar expuesta un total de (8 * 60)/159 = 3.0189 segundos. O lo que es lo mismo, 0.33125 imágenes por segundo.

Antes de montar el vídeo he redimensionado las imágenes, de forma que tengan todas 800×600. Este paso se puede obviar, el problema, es que se puede aparecer, una parte de la imagen anterior y una parte de la imagen posterior en imágenes que sean mas altas que anchas, y da sensación de chapuza. En principio podías pensar en mogrify:

mogrify -resize 800x600 *.JPG

Pero con esto no vas a obtener el resultado que perseguimos, dado que lo que va a hará será ajustar al menor de los lados. Es decir si es una imagen con una altura superior a 600, escalará la imagen de forma que quede con esta altura, pero la anchura será menor, y estaremos en el mismo caso que antes.

Por esta razón utilizamos el siguiente script de Python:

import sys
import math
from os import path
from sys import argv
from PIL import Image

def isinteger(x):
try:
return int(x) == x
except:
return False
def tointeger(x):
try:
return int(x)
except:
return 0
def main():
argv = sys.argv
if len(argv) < 2: print 'At least one file to resize' exit(-1) W = 800 H = 600 files=argv[1:] for file in files: if path.splitext(file)[1].upper() == '.JPG': tf=path.splitext(file) im = Image.open(file) w,h=im.size scalex = w / float(W) scaley = h / float(H) if scalex > scaley:
scale = scalex
else:
scale = scaley
w = int(w / scale)
h = int(h / scale)
im_out = im.resize((w,h), Image.BICUBIC)
im_out = im_out.convert('RGBA')
background = Image.new('RGBA', (W,H), (0, 0, 0, 0))
xi=int(math.fabs(W-w)/2)
xf=int(math.fabs(W+w)/2)
yi=int(math.fabs(H-h)/2)
yf=int(math.fabs(H+h)/2)
background.paste(im_out,(xi,yi,xf,yf))
im_out = background
im_out.save(tf[0]+'_'+str(W)+'x'+str(H)+tf[1])
exit(0)

if __name__ == '__main__':
main()

que puedes descargar desde aquí:

[wpfilebase tag=file id=89]

Ahora solo tienes que copiar este script en el directorio en cuestión y redimensionar las imágenes:

python redimensiona800x600.py *.JPG

Lo que hace el script es crear un fondo de color negro de dimensiones 800×600 y sobre el pega nuestra imagen, ahora si que todas las imágenes tendrán las dimensiones requeridas.

Hayamos redimensionado las imágenes o no, ahora toca montar el vídeo. Para ello utilizaremos el siguiente comando:

mencoder mf://*.JPG -mf w=800:h=600:fps=0.33125:type=jpg -ovc copy -oac copy -o video.avi

la extensión *.JPG es porque todas las imágenes tienen la extensión en mayúsculas. Los siguientes parámetros corresponden al ancho (w=800) y alto (h=600) de las imágenes. Luego tenemos la tasa de imágenes por segundo (fps=0.33125), que como hemos calculado antes es de 0.33125 imágenes por segundo para que dure exactamente 8 minutos, y los siguientes parámetros es para que copie el video (-ovc) para que copie el audio (-oac), aunque todavía no tenemos y por último, el archivo de salida (-o video.avi)

Obteniendo el audio

El audio lo voy a sacar de youtube. Para obtener el audio y dado que partimos de que lo hacemos todo desde el terminal, utilizaré el comando youtube-dl. Con esto bajo el vídeo en cuestión:

youtube-dl https://www.youtube.com/watch?v=zsr6c4TrWBg

Ahora toca extraer el audio de este vídeo, para ello recurrimos de nuevo a mencoder:

mencoder zsr6c4TrWBg.flv -of rawaudio -oac mp3lame -ovc copy -o audio.mp3

Montando video y audio

Como paso final, nos queda componer video y audio:

mencoder -ovc copy -audiofile audio.mp3 -oac copy video.avi -o output.avi

Resumiendo

Todo esto lo he montado en un script «de_fotos_a_pelicula.sh»:

#!/bin/bash
python redimensiona800x600.py *.JPG
mencoder mf://*_800x600.JPG -mf w=800:h=600:fps=0.33125:type=jpg -ovc copy -oac$
rm -f *_800x600.JPG
mencoder zsr6c4TrWBg.flv -of rawaudio -oac mp3lame -ovc copy -o audio.mp3
mencoder -ovc copy -audiofile audio.mp3 -oac copy video.avi -o output.avi
rm -f video.avi audio.mp3

y lo he lanzado anteponiendo el comando «time», para conocer el tiempo que tarda en hacer toda la operación:

real 1m3.918s
user 0m53.730s
sys 0m1.020s

Como ves nada una miseria, un poco más de un minutillo.

El resultado

[youtube=https://www.youtube.com/watch?v=y4mSYqhcRDc&w=640&h=510]

Conclusiones

Evidentemente, donde vas a «perder» más tiempo es seleccionando las fotografías que quieres incorporar en el vídeo y la música que le quieres poner. Pero una vez solucionado estos dos puntos, que no son nada despreciables, y decidiendo el orden de las imágenes, montar el video es «coser y cantar«.

Claro que no tiene ningún efecto especial, ni cosas por el estilo. Pero se trata de realizar un vídeo rápido y sin dedicarle mucho tiempo a los aspectos técnicos, solo tienes que elegir las fotografías, el orden y la música. Sencillo pero efectivo.

Más información: MPlayerhq, electron.mit.edu, youtube-dl, commandlinefu.com, superuser.com, daveymorris.co.uk, manpagez, refranespopulares

5 comentarios en “Hacer un vídeo de fotografías en un minuto desde el terminal

  1. FE
    Fernan13malaga hace 13 años

    Genial ! Había estado buscando ésto para hacer «time lapses» que no requiere el redimensionado de las imágenes, el caso es que mencoder me daba problemas en ubuntu 10.04 64bits, a ver si tengo un rato y lo pruebo siguiendo tu tutorial.

    Muchas gracias !

  2. DA
    daas88 hace 13 años

    esta bien pero lo de redimensionar las imagenes lo hago con un programa llamado phatch, esta en los repos.

  3. DA
    Darviejo hace 13 años

    Soy un novato de 74 años, quisiera me ayudes, cual serian los 10 pasos a seguir,para crear el video, me interesa, es muy bueno.
    Gracias

  4. PU
    Punin133 hace 13 años

    ¿ Como has calculado los fps ?

  5. MA
    mariano hace 11 años

    cuando escribo el comando para montar el video, mencoder mf://*.JPG -mf w=800:h=600:fps=0.33125:type=jpg -ovc copy -oac copy -o video.avi, me sale un error.. como que especifique la ruta de o- option

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *