11 de juliol 2017

Transmitir música y voz en una videoconferencia con Linux

Transmitiendo música por hangouts
Reescrito en diciembre de 2017
Primera versión: julio 2017


Este ya no tan sencillo tutorial nos permitirá emitir los sonidos de nuestro ordenador juntamente con nuestra voz en una conversación de hangouts, appear.in, skype o similares, siendo válido en general para cualquier programa que grabe audio desde el micrófono.
Los únicos requisitos previos son tener instalado el servidor de sonido pulseaudio y su mezclador pavucontrol.

Empezamos. Abrimos un terminal y tecleamos los siguientes comandos:
pactl load-module module-null-sink sink_name=voip_out
pactl load-module module-loopback latency_msec=1 sink=voip_out
Con esto lo que hemos hecho es crear un dispositivo virtual de salida al que hemos llamado voip_out y un flujo virtual conectado a él.
Al abrir el control de volumen de pulseaudio (pavucontrol) veremos que aparecen los nuevos elementos creados.
En la pestaña Grabación tendremos el flujo virtual (loopback) que estará escuchando del dispositivo de entrada por defecto de nuestro sistema (un micrófono, típicamente). Según el sistema y los dispositivos que tengáis los nombres variarán; consultad las pestañas de dispositivos de entrada y salida para identificarlos.

A continuación abriremos el reproductor o reproductores que vayamos a usar para emitir música o sonidos y le damos al play. En la pestaña Reproducción nos aparecerá dicho programa y le indicaremos que envíe su salida al dispositivo virtual (salida nula o null sink).

El siguiente paso será iniciar una videollamada (una de prueba ya sirve). En la pestaña Grabación del mezclador nos aparecerá el programa, al que indicaremos que “escuche” del monitor de la salida virtual (salida nula). Es importante recalcar que los programas sólo aparecerán en el mezclador si están grabando o transmitiendo. Eso sí, estos ajustes quedan memorizados, así que no habrá que cambiarlos cada vez que paremos la música o hagamos una nueva videollamada.

Llegados a este punto ya estaremos enviando voz y música a nuestros interlocutores. ¿Problema? Nosotros no oiremos la música. Podríamos cargar otro módulo loopback desde la salida voip_out y enviarla a la salida de audio del sistema, pero entonces también oiríamos nuestra propia voz.
Para solucionarlo cargaremos tres módulos más:

pactl load-module module-null-sink sink_name=musica
pactl load-module module-loopback source=musica.monitor sink=voip_out
pactl load-module module-loopback source=musica.monitor
Con estos comandos hemos creado otro dispositivo virtual de salida al que hemos llamado musica y dos flujos loopback que escuchan de él; uno conectado a voip_out y otro a la salida estándar de nuestro sistema.
Puede parecer un poco confuso, especialmente al abrir pavucontrol y comprobar que los dos dispositivos virtuales se llaman igual (salida nula). Para distinguirlos hay que tener en cuenta que aparecen en orden de creación.

Pestaña Grabación

Pestaña Reproducción

Nos falta enviar algo a este nuevo dispositivo virtual: el reproductor de música. De esta manera enviaremos su salida a nuestros interlocutores y a nuestros auriculares.
Entenderemos mejor lo que hemos hecho con un esquema:

Es más difícil entenderlo que hacerlo

Nota para Hangouts: en las opciones de la videollamada debéis cambiar la calidad de sonido de voz a estudio, de lo contrario la música no se escuchará con buena calidad.

Una vez terminemos quizá queramos desmontar el tinglado. La manera rápida de eliminar el dispositivo y flujos virtuales creados es escribiendo el siguiente comando en un terminal:

pactl unload-module module-null-sink
Esto eliminará todos los dispositivos virtuales y con ellos los flujos asociados a ellos.
La forma elegante de hacerlo es eliminar cada módulo usando su número de identificación (que recibimos por terminal al crearlo) usando el siguiente comando:

pactl unload-module
En cambio si lo que queremos es conservarlos de forma permanente para no tener que crearlos cada vez, lo que tendremos que hacer es añadir los comandos al fichero /etc/pulse/default.pa .
Para poder hacer mezclas y conexiones más complejas tendríamos que instalar el servidor de sonido JACK, pero eso ya será para otra ocasión.


Bonus track: reducción de eco/ruido


Pulseaudio incorpora un módulo de reducción de eco y ruido para el micrófono, pero no está cargado por defecto:

pactl load-module module-echo-cancel
Una vez en marcha nos aparecerá como un elemento nuevo en el mezclador. Para usarlo, allí donde seleccionábamos el micrófono escogeremos el que incluye la coletilla echo cancelled with
Este módulo incluye un ajuste dinámico del volumen, lo que puede resultar molesto en según qué situaciones. Para eliminar dicha funcionalidad arrancaremos el módulo con este chorro de parámetros:

pactl load-module module-echo-cancel aec_method=webrtc aec_args="analog_gain_control=0\ digital_gain_control=0"

Cap comentari:

Publica un comentari a l'entrada