Quienes hayan intentado grabar el video del escritorio junto con el audio de salida de los parlantes, sin utilizar el servidor de sonido PulseAudio, se habrán dado cuenta de que es imposible. Se graba el video perfectamente, pero no el audio. Aunque existe un truco para superar esta limitación de ALSA, que consiste en agregar una interfaz de audio loopback mediante un módulo del kernel. En este artículo voy a explicar cómo implementarlo de forma sencilla. Ideal para quienes quieran hacer secreencasting de video del escritorio más el audio de salida por los parlantes en GNU/Linux, sin utilizar pulse (por ejemplo en Slackware).



PulseAudio es un servidor de sonido que acepta señales de diferentes fuentes (procesos o dispositivos de captura) y las redirecciona hacia diferentes destinos (tarjetas de sonido, servidores remotos u otros procesos). En definitiva, funciona como un router de audio. Una de las pocas distribuciones GNU/Linux que no utilizan PulseAudio es Slackware, ya que utiliza únicamente ALSA (Advanced Linux Sound Architecture). Como siempre, Slackware utiliza únicamente ALSA ya que es más estable que PulseAudio. PulseAudio ofrece muchas características adicionales, pero tiene muchos problemas con diferentes distribuciones, notablemente Ubuntu (existen muchos tutoriales sobre cómo pasar de PulseAudio a ALSA al respecto).

En los artículos Grabación de video del escritorio en alta calidad y Cómo grabar la salida de video de la pantalla utilizando ffmpeg demostré diferentes alternativas para capturar el video del escritorio en GNU/Linux utilizando ffmpeg. FFmpeg es una colección de herramientas libres que permiten grabar, convertir y hacer streaming de audio y vídeo. Las partes más importantes de FFmpeg son la librería libavcodec, una biblioteca de códecs utilizada en muchos otros proyectos; la librería livavformat para codificar y decodificar contenedores de audio y video; y la herramienta ffmpeg para manipular archivos multimedia desde la línea de comandos.

Cómo grabar el video del escritorio junto con el sonido interno utilizando ALSA

Cómo mencioné anteriormente, para lograr capturar el audio de salida utilizando el servidor de sonido ALSA, es necesario agregar una tarjeta de sonido virtual con la entrada conectada a la salida. Para ello se utiliza el módulo del kernel snd-aloop:

# modprobe snd-aloop

Luego de ejecutar esta acción, es necesario crear un script de configuración de sonido ~/.asoundrc para el usuario actual que permita enviar el audio a la tarjeta loopback y a la salida real de los parlantes simultáneamente. Utilizar el siguiente contenido:

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  #capture.pcm "looprec"
  capture.pcm "hw:0,0"
}

pcm.looprec {
    type hw
    card "Loopback"
    device 1
    subdevice 0
}


pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}


pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  slaves.b.channels 2
  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave b
  bindings.2.channel 0
  bindings.3.slave b
  bindings.3.channel 1
}


pcm.MixReale {
  type dmix
  ipc_key 1024
  slave {
    pcm "hw:0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # debe ser una potencia de 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # debe ser una potencia de 2
    buffer_size 8192
  }
}

Luego es posible utilizar ffmpeg para capturar el video del escritorio mediante -f x11grab -s `xdpyinfo | grep dimensions | awk '{print $2}'` -r 30 -i :0.0 -vcodec libx264 -preset ultrafast -crf 0 y el audio desde la interfaz loopback mediante -f alsa -ac 2 -i looprec:

$ ffmpeg -f alsa -ac 2 -i looprec -f x11grab -s `xdpyinfo | grep dimensions | awk '{print $2}'` -r 30 -i :0.0 -vcodec libx264 -preset ultrafast -crf 0 /tmp/outvideo.mkv

Ejemplo de captura:

¡Eso es todo!


Tal vez pueda interesarte


Compartí este artículo