ffmpeg

De vez en cuando me da por grabar un vídeo de cómo dibujo con el inkscape y esas cosas, lo acelero, le pongo música y lo cuelgo en youtube. Pues bien voy a explicar cómo hago toda esa mierda, para cuando se me olvide, o por si alguien que esté aburrido lee estoy y le sirve de ayuda.
Grabación del vídeo
Para grabar lo que hago en mi escritorio utilizo una fantabulosa aplicación llamada gtk-recordmydesktop. Esta aplicación me genera un fichero out.ogv.
Conversión a avi y aceleración
El ogv está muy bien, pero si lo quieres subir a youtube o a algún sitio de estos es mejor convertirlo. Yo lo convierto a avi usando mencoder. Además acelero el vídeo para que no sea un tostón de 30min:
mencoder out.ogv -fps 250 -vf scale=640:375 -ovc lavc -o output.avi
Creación de cabecera
Para que el vídeo quede más bonito se le puede añadir una cabecera, una imagen con texto que salga antes del vídeo y que desaparezca con un fundido.
Para ello vamos a utilizar imagemagick, ffmpeg y mencoder.
Primero capturamos el primer frame del vídeo:
ffmpeg -i output.avi -vcodec png -vframes 1 -ss 00:00:00 -an -f rawvideo first.png
Luego con el gimp o con el editor que te de la gana, creamos la imagen de cabecera que vamos a introducir, del mismo tamaño que first.png (640x375). Recomiendo un texto claro y simple sobre fondo negro. Y a esta imagen la llamamos title.png.
Ahora ejecutamos el siguiente script en el mismo directorio donde están las imágenes title.png y first.png.
#!/bin/bash tmpname=tmpcrop.png ext=.png startimage=title.png endimage=first.png qual="100%" percent=100 counter=0 while (( percent > 0 )) do counter=$(($counter+1)) if [ $counter -lt 10 ] then n="0$counter" else n="$counter" fi composite -blend $percent -gravity center $startimage $endimage -quality $qual frame$n$ext percent=$(($percent-2)) done
Este script genera una animación de 50 frames de "fade out" de la imagen de cabecera hacia el primer frame, el fundido.
Ahora para que se pueda ver la cabecera, copiamos la imagen repetidas veces, unas 100 estará bien:
for i in $(python -c "print '\n'.join('%02d'%i for i in range(1,100))"); do cp title.png a$i.png ; done
Ahora borramos title.png y first.png y generamos un .avi a partir de todos los pngs que tenemos:
mencoder mf://*.png -mf fps=25:type=png -ovc lavc -lavcopts vcodec=mpeg4 -oac copy -o title.avi -ffourcc DX50
Todo junto, unir dos .avi
Para unir la cabecera con el vídeo usaremos ffmpeg y cat. Convertimos los dos vídeos a vídeos temporales mpeg:
ffmpeg -i output.avi -sameq main.mpeg ffmpeg -i title.avi -sameq title.mpeg
Y los vídeos mpeg se pueden unir con el comando cat:
cat title.mpeg main.mpeg > video.mpeg
Y lo volvemos a convertir a avi:
ffmpeg -i video.mpeg -sameq video.avi
Vamos a por el sonido
Ahora queremos añadirle una banda sonora, así que buscamos una canción bonita que vaya con nuestro vídeo y que dure algo más. Podemos ver la duración del vídeo reproduciéndolo con mplayer y pulsando oo.
El archivo de sonido se puede retocar con audacity para recortarlo, añadirle efectos de fadein fadeout al principio y al final, etc. Pero aquí voy a explicar como añadir el efecto de fadeout al final con sox, desde la consola.
Fadeout mp3 con sox
Para que quede bien el corte a la canción vamos a añadir el efecto de fundido en el sonido. Supongamos que tenemos la canción elegida y se llama soundtrack.mp3.
Lo primero es convertirla a wav para trabajar sobre ella:
lame --decode soundtrack.mp3 soundtrack.wav
Ahora supongamos que nuestro vídeo dura dos minutos y queremos que el fundido sea en los últimos 5 segundos:
sox soundtrack.wav st.wav fade t 0 120 5
El 120 son los dos minutos (en segundos) y el 5 son los 5 segundos de fundido.
El efecto fade con sox recibe cuatro parámetros:
fade [type] fade-in-length [stop-time [fade-out-length]]
Puedes ver más ejemplos y detalles sobre sox en su manual, man sox.
Ahora convertimos el wav a mp3:
lame st.wav
Añadir banda sonora. Adjuntar audio a video
Para finalizar vamos a unir el mp3 que hemos editado con el vídeo. Para ello vamos a utilizar mencoder:
mencoder video.avi -o final.avi -ovc copy -oac copy -audiofile st.wav.mp3
Y con esto y un bizcocho tendremos un vídeo genial para subir a youtube o a donde haga falta, y todo hecho desde la línea de comandos, por lo que podríamos crearnos un megascript que le metiera una cabecera y unos créditos a nuestros vídeos de manera automatizada.


