Procesando audio y vídeo desde terminal con avconv

Programas para hacer screencasting en Linux hay muchos, algunos de ellos ya mencionados en este blog: Open BroadCaster Software Multiplatform, Kazam, RecordMyDesktop, Byzanz o FFmpeg.

Hoy vamos a añadir avconv a la familia. Poniéndolo en contexto, avconv pertenece a un proyecto más grande llamado libav que a su vez, nació como un fork de FFmpeg en 2011. Los desarrolladores de libav son más conservadores a la hora de incoporar cambios al código que los de FFMpeg. De hecho, esa distina concepción de cómo se tenía que llevar a cabo el desarrollo de la herramienta fue una de las principales de razones para que naciera el nuevo proyecto. A día de hoy, la filosofía que se sigue en ambos sigue siendo fiel a sus correspondientes orígenes, unos más conservadores y otros más innovadores. Razones para utilizar uno u otro hay muchas, así como debates sobre el futuro y viabilidad de cada proyecto, aunque no corresponde a este artículo discutirlas.

Al grano… Para utilizarlo tendremos que tirar de terminal aunque es muy sencillo de utilizar. La documentación es extensa pero aquí voy a ir al grano con algunos ejemplos prácticos y fragmentos de código listos para su uso.

Primero de todo instalamos las herramientas que vamos a necesitar:

apt-get install libav-tools pulseaudio

También como uno de los primeros requisitos tendremos que identificar el dispositivo de entrada de audio que utilizará avconv para la grabación. Podemos hacerlo con el comando pactl list sources. Veremos que tenemos varias fuentes (Sources) a elegir como dispositivo de entrada. Puede resultar confuso, pero una manera muy sencilla de ver qué dispositivo de entrada es el activo que utiliza nuestro sistema consiste en reproducir un vídeo (por ejemplo en Youtube), hacer un listado con pactl list sources, y comprobar cuál de los dispositivos está en IDLE o ACTIVE. Yo obtengo:

...
Source #1
	State: IDLE
	Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
	Description: Monitor of Built-in Audio Analog Stereo
...

Bien, quédate con lo que sigue a Name, ése es el nombre de dispositivo de entrada que utilizaremos con avconv. En mi caso alsa_output.pci-0000_00_1b.0.analog-stereo.monitor

A continuación algunos ejemplos de grabación en distintos formatos:

  • Un sencillo snippet para grabar audio en formato ogg utilizando libvorbis:
    avconv -f alsa \
    -ac 2 \
    -ar 48000 \
    -f pulse \
    -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
    -acodec libvorbis \
    -aq 6 \
    -y audio.ogg
    
  • Snippet para grabar en formato MP3 utilizando libmp3lame:
    avconv -f alsa \
    -ac 2 \
    -ar 48000 \
    -f pulse \
    -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
    -acodec libmp3lame \
    -aq 0 \
    -y audio.mp3
    
  • Para vídeo MP4 la cosa se complica un poco. Tendremos que especificar además del dispositivo de entrada unos cuantos parámetros más: resolución, display, codec, rate… Para la resolución yo he puesto la nativa de mi monitor que estoy utilizando en este momento. Podéis ver la que tenéis con el comando xrand:
    Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 16384 x 16384
    DVI-I-0 disconnected (normal left inverted right x axis y axis)
    DVI-I-1 disconnected (normal left inverted right x axis y axis)
    DP-0 disconnected (normal left inverted right x axis y axis)
    DP-1 disconnected (normal left inverted right x axis y axis)
    DP-2 disconnected (normal left inverted right x axis y axis)
    DP-3 disconnected (normal left inverted right x axis y axis)
    HDMI-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm
       1920x1080     60.00*+  59.94    50.00    60.00    50.04  
       1680x1050     59.95  
       1440x900      59.89  
       1280x1024     75.02    60.02  
       1280x960      60.00  
       1280x720      60.00    59.94    50.00  
       1152x864      75.00  
       1024x768      75.03    70.07    60.00  
       800x600       75.00    72.19    60.32    56.25  
       720x576       50.00  
       720x480       59.94  
       640x480       75.00    72.81    59.94    59.93  
       480x576       50.00  
       480x480       59.94  
    DP-4 disconnected (normal left inverted right x axis y axis)
    DP-5 disconnected (normal left inverted right x axis y axis)
    

    La seleccionada aparece en current, además de más abajo con un asterisco junto a la frecuencia de refresco de pantalla. Una manera más limpia de obtener la resolución actual:

    xrandr | awk -F "current" '{print $2}' | head -1 | cut -d "," -f1 | tr -d " "
    

    Y aquí el snippet para grabar un MP4 utilizando libx264:

    avconv -f pulse \
    -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
    -f x11grab \
    -r 30 \
    -s 1920x1080 \
    -i :0.0 \
    -vcodec libx264 \
    -preset ultrafast \
    -threads 4 \
    -strict experimental \
    -y video.mp4
    

Avconv también se puede utilizar como herramienta de conversión entre formatos. Aquí un Gist con algunos tips y ejemplos:

Como decía al principio del artículo, algunos prefieren FFmpeg a avconv para estos menesteres. Aunque el primero tiene más actividad y desarrollo en la actualidad, avconv sigue siendo una alternativa viable teniendo en cuenta además su facilidad de uso.