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

-1920×1080 : Indica la resolución. Vamos a hacer un vídeo en Full HD.

openshot-qt/ : Es el directorio del repositorio, debemos indicar un directorio que tenga algún tipo de control de versiones: git, svn, csv…

–stop-at-end : El programa finalizará cuando termine de analizar commits. En realidad este argumento no es necesario , porque -o implica que se pare al finalizar, pero nos viene bien por si queremos practicar un poco con gource antes de crear el vídeo.

, porque implica que se pare al finalizar, pero nos viene bien por si queremos practicar un poco con gource antes de crear el vídeo. -s 1 : Nos dará la velocidad de la simulación en segundos por día. Aunque en realidad el número de segundos que tiene un día en el repositorio puede variar dependiendo del número de commits que haya ese día.

-c 1.6 : Acelera la simulación un poco. 1 sería mantenerla a la misma velocidad. 4 sería el máximo.

–camera-mode track : los modos válidos son overview y track. Probad los dos y quedaos con el que más os guste.

–multi-sampling : reduce el aliasing de un modo económico.

-r 25 : mi vídeo tendrá 25 fotogramas por segundo.

–highlight-all-users : resalta los nombres de todos los usuarios. Podemos, si queremos resaltar un usuario concreto con –highlight-user [nombre_de_usuario]

–disable-progress : Elimina la barra de progreso en la ventana de gource. No haría falta, puesto que -o anula esta configuración. Pero, como antes, si queremos investigar nos viene bien.

-a 1 : Si no hay commits durante un segundo, saltamos al siguiente commit en el tiempo.

-o – : Exportamos el vídeo generador en formato de secuencia de imágenes PPM. Aquí podemos dar un nombre de archivo base o, como en este caso – indicará que las imágenes se exportarán en la salida del programa. Si lo ejecutamos tal cual, se empezará a llenar la terminal de símbolos raros. Es mejor poner – sólo cuando vayamos a encadenar con otro comando.

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:

-y : No pide confirmación para sobreescribir los archivos. Es útil cuando estamos haciendo pruebas, pero por seguridad podríamos quitarlo.

-r 25 : El número de fotogramas por segundo, 25. Lo especificamos en gource, pero lo volvemos a indicar aquí para que los dos programas trabajen a la misma velocidad. Podríamos jugar con estos parámetros para conseguir más o menos velocidad.

-f image2pipe : El formato de los datos de entrada será en forma de secuencia de imaǵenes a través de pipe (la tubería que hemos hecho encadenando los dos programas).

-c:v ppm El formato de los datos de la secuencia de imágenes es PPM. (Para que gource y avconv hablen el mismo idioma).

-i pipe:0 : Las imágenes de entrada vendrán por la entrada estándar (0) a través de pipe.

-threads 1 : Utilizaremos sólo 1 thread para la compresión. Podremos utilizar más, o no especificar este parámetro para que sea automático y tal vez vaya todo un poco más rápido. Pero si el repositorio es muy grande, y vamos a necesitar varias horas para crear el vídeo, tal vez nos interese poder utilizar el ordenador para otras cosas mientras, así que limito el número de cores a utilizar.

-c:v libx264 : Voy a utilizar un format de vídeo h264 (mp4). Puedo especificar si quiero con -b:v los bits por segundo para mi vídeo, para aumentar o disminuir la calidad.

-preset ultrafast : libx264 utiliza preconfiguraciones con parámetros para facilitarnos la creación de vídeo, en este caso van determinados por velocidad. Cuanto más lenta se haga la compresión, más pequeño será el archivo, ultrafast, en este caso nos proporciona la compresión más rápida, pero el tamaño de archivo más grande (h264 comprime mucho, pero si ponemos un veryslow aquí veremos una calidad similar y un archivo mucho más pequeño).

-f mp4 : Crearemos un archivo mp4. Aquí podremos poner avi, o matroska si lo preferimos. En realidad no hace falta puesto que la extensión del archivo (siguiente parámetro lo especifica, pero está bien para investigar.

videofinal.mp4 : nombre de archivo donde vamos a guardarlo.

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:

-audio-track [pista.mp3] : Especificamos una pista de audio. ¡La música de fondo!

-track

-filter sepia : Especificamos un filtro sepia. Podemos probar con muchísimos fitlros. Ejecutad $ melt -query filters para verlos todos

-consumer avformat:videofinal.mp4 : Grabamos el vídeo en el archivo videofinal.mp4

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.