Poesía Binaria

¿Cómo visualizar la progresión del código fuente de un proyecto en vídeo?

Nos gusta desarrollar, y muchas veces, sobre todo cuando el equipo de desarrollo es grande, apetece enseñar la evolución de nuestro código a los demás de una forma visual. Y, ¿qué mejor que con un vídeo? Un vídeo nos ayudará, de un vistazo a ver lo grande que es nuestro proyecto, las épocas de más o menos cambios, los usuarios implicados, etc. Y luego puedes colgar el vídeo en alguna red social de vídeos, utilizarlo como apoyo para presentaciones, y mucho más. Por cierto, no sólo está limitado a nuestros proyectos, cualquier código al que podamos acceder por git, svn, csv, etc será susceptible de ser convertido en vídeo.

Visualizar código con gource

Gource es un programa que hace una representación de los repositorios en el tiempo. Analiza el contenido de los logs y crea una muestra en pantalla con movimientos suaves y efectos de luces utilizando OpenGL. El software se puede ejecutar tanto en Linux como Windows y es muy estable, lo he probado en repositorios de varios gigas y casi 10 años de commits sin problema. Es verdad que si hacemos un vídeo, sobre todo por la resolución y la conversión de vídeo va un poco más lento, pero es algo que puede quedarse en segundo plano.

Para los ejemplos, he utilizado el repositorio de GitHub del proyecto openshot-qt. Porque me ha parecido interesante hacerlo con este proyecto.

Combinación con ffmpeg/avconv

Gource, es incapaz de exportar a vídeo, pero como en la mayoría de aplicaciones que ejecutamos en GNU/Linux, podemos encadenar comandos y pasar el flujo de datos de una aplicación a otra, por ejemplo, una aplicación como ffmpeg o avconv con la que podemos hacer pasar streams de imágenes y guardarlas en formato vídeo con el formato que queramos… o incluso le podemos añadir música o efectos si pasamos el vídeo a los programas adecuados.

En principio, vamos a guardar nuestro vídeo generado con gource en un archivo de vídeo, y para ello utilizaremos la salida en formato de secuencia de imágenes PPM que nos da gource y lo encadenaremos con una tubería hasta avconv, con el que crearemos el vídeo definitivo:

gource -1920×1080 openshot-qt/ --stop-at-end -s 1 -c 1.6 --camera-mode track --multi-sampling -r 25 --user-scale 3 --highlight-users --disable-progress -a 1 -o --  | avconv -y -r 25 -f image2pipe -c:v ppm -i pipe:0 -threads 1 -c:v libx264 -preset ultrafast -f mp4 videofinal.mp4

Expliquemos esto un poco:

Ahora bien, hemos terminado de analizar los argumentos para gource, ahora la salida de este programa la vamos a pasar a la entrada de avconv (esto lo hacemos con |, que indicará una tubería o pipe). Analicemos los argumentos de avconv:

Ahora, sólo tenemos que dejar que el programa haga lo que tiene que hacer, si el repositorio es muy grande tardará un rato bastante largo. Es importante no cerrar la ventana de gource mientras se está creando el vídeo. Además, podemos manejarla de forma interactiva, haciendo zoom, moviendo o utilizando teclas especiales para mostrar más o menos información.

Añadiendo una pista de música

Un vídeo así queda muy soso, así que vamos a utilizar avconv para añadir una pista de música. Yo he utilizado una pista de Josh Woodward. Un artista que tiene una gran colección de canciones Creative Commons tanto instrumentales como con voz. Así que, le vamos a decir a avconv que utilice una pista de audio de la siguiente forma:

gource -1920×1080 openshot-qt/ --stop-at-end -s 1 -c 1.6 --camera-mode track --multi-sampling -r 25 --user-scale 3 --highlight-all-users --disable-progress -a 1 -o --  | avconv -y -r 25 -f image2pipe -c:v ppm -i pipe:0 -i ~/Descargas/JoshWoodward-NQC-NoVox-03-SheDreamsInBlue.mp3 -threads 1 -c:v libx264 -preset ultrafast -f mp4 videofinal.mp4

Como vemos, es muy parecido a lo de antes, sólo añadiendo una pista más con -i

Vídeo generado

Añadiendo efectos

Pero claro, esto está muy bien, pero en GNU/Linux no estamos limitados a esto. Podríamos crear, directamente, el vídeo añadiendo algún efecto. Avconv dispone de sus filtros, aunque vamos a utilizar filtros de MLT, muchos de estos filtros también se procesan en GPU y utilizan multi-threading, por lo que, aunque a avconv le digamos que utilice solo un thread, tal vez MLT esté haciendo un uso más intensivo de CPU para aplicar sus filtros.
Aunque en futuros posts me dedicaré más a fondo a este software, aquí haremos una pequeña introducción.

Para empezar, la música, en lugar de introducirla con avconv, la voy a introducir con MLT (en adelante, en línea de comandos, será melt). El hecho de hacerlo con melt, es porque melt va a utilizar datos provenientes de una pipe de avconv (es un jaleo, gource pasa datos por pipe a avconv y avconv otra pipe para melt). Mi objetivo era simplificar la pipe para melt y no complicarme la vida exportando el audio también.

Aquí va el pequeño comando:

melt -audio-track ~/Descargas/JoshWoodward-NQC-NoVox-03-SheDreamsInBlue.mp3 -track <(gource -1920×1080 openshot-qt/ --stop-at-end -s 1 -c 1.6 --camera-mode track --multi-sampling -r 25 --user-scale 3 --highlight-all-users --disable-progress -a 1 -o --  | avconv -y -r 25 -f image2pipe -c:v ppm -i pipe:0 -threads 1 -b:v 12000k -f m4v pipe:1) -filter sepia -consumer avformat:videofinal.mp4

Como vemos, todo el comando anterior de gource y avconv lo hemos metido entre <( y ) para crear una pipe que podamos pasar como un archivo (sería una pipe con nombre). Además, a avconv le hemos dicho que exporte el vídeo el formato m4v por pipe:1 que sería una pipe de salida estándar. Por otro lado, le hemos dicho que el bitrate de vídeo sea de 12000k por segundo.

Luego a melt le hemos dicho:

Con melt también podemos añadir efectos de audio, fundidos, marca de agua e infinidad de cosas más como veremos en futuros posts.

Sugerencias y comentarios

Deja un comentario debajo con tus dudas, sugerencias, ideas y frikadas. Y si tienes un repositorio del que hayas hecho un vídeo, déjamelo por aquí, seguro que es muy interesante verlo.

Actualización 08/09/2017: Arreglo un problema de visualización tras actualizar WordPress.

También podría interesarte....