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
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 !
esta bien pero lo de redimensionar las imagenes lo hago con un programa llamado phatch, esta en los repos.
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
¿ Como has calculado los fps ?
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