Cómo identificar fácilmente el dispositivo de captura de audio para FFmpeg/Libav

por | julio 19, 2017

Suele ser un tema recurrente y problemático: si queremos capturar audio con FFmpeg o Libav (avconv), ¿cómo podemos averiguar el dispositivo de entrada de audio?

Existe una manera sencilla de localizarlo con PulseAudio. En primer lugar conviene conocer el concepto de «monitor» ya que vamos a utilizarlo durante el resto del artículo. Una definición algo informal pero directa y fácil de entender la encontramos en la documentación de Arch Linux:

To be able to record from a monitor source (a.k.a. «What-U-Hear», «Stereo Mix»), use pactl list to find out the name of the source in PulseAudio (e.g. alsa_output.pci-0000_00_1b.0.analog-stereo.monitor)…

What-U-Hear nos da una pista, ya que será el monitor del dispositivo en cuestión el que nos servirá para capturar audio con FFmpeg o Libav.

Todo esto está muy bien pero… ¿cómo sabemos qué dispositivo de audio reproduce el audio que queremos capturar? Muy sencillo, reproducimos cualquier audio o vídeo con audio y ejecutamos pavucontrol (Pulse Audio Volume Control). Una imagen vale más que mil palabras:

Como vemos, el dispositivo en uso es el que muestra actividad, representada por la barra de intensidad de audio que sube y baja. En mi caso es Built-in Audio Analog Stereo.

Ahora con la utilidad pactl vamos a listar las fuentes de audio:

pactl list sources

A continuación la parte que nos interesa, ya que estamos buscando el monitor del dispositivo Built-in Audio Analog Stereo anteriormente mencionado:

...
Source #1
	State: RUNNING
	Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
	Description: Monitor of Built-in Audio Analog Stereo
	Driver: module-alsa-card.c
	Sample Specification: s16le 2ch 44100Hz
	Channel Map: front-left,front-right
	Owner Module: 7
	Mute: no
	Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
	        balance 0.00
	Base Volume: 65536 / 100% / 0.00 dB
	Monitor of Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
	Latency: 0 usec, configured 40000 usec
	Flags: DECIBEL_VOLUME LATENCY 
	Properties:
		device.description = "Monitor of Built-in Audio Analog Stereo"
		device.class = "monitor"
...

Como vemos en device.description o Description esta fuente es «Monitor of Built-in Audio Analog Stereo», justo lo que estábamos buscando. Para capturar audio utilizaremos su nombre, es decir, alsa_output.pci-0000_00_1b.0.analog-stereo.monitor.

De esta manera, si queremos capturar el audio en formato mp3 con FFmpeg bastaría con utilizar los parámetros -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor

ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -acodec libmp3lame -qscale:a 4 -y mysong.mp3

Si se tratara de un vídeo mp4, para capturar el audio incluiríamos los parámetros anteriormente mencionados:

ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -f x11grab \
-r 30 -s 800x600 -i :1 -vcodec libx264 -preset ultrafast -strict experimental myvideo.mp4

Para Libav (avconv) se utilizan los mismos parámetros.

Lo que he comentado en este artículo también aplica a otro tipo de software. Por ejemplo en SimpleScreenRecorder tendremos que seleccionar el dispositivo de audio que utilizaremos como fuente para la captura:

Por tanto, ya sea con FFmpeg, Libav o cualquier otro programa tendremos una manera sencilla de detectar el dispositivo de audio a utilizar para la captura. Ya que estamos, también conviene tenerlo en cuenta a la hora de configurar las variables de Easy-Avconv o Human-Friendly-FFmpeg 😉