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 😉