Emitir audio de Mumble en servidor IceCast #RadiosLibres
Como algunos de vosotros sabréis, participo en Birras y Bits un podcast que habla sobre Software Libre y GNU/Linux entre otras cosas. La pasada semana empezamos con la nueva temporada y unas de las novedades que queremos hacer es poder emitir la grabación del podcast online y habilitar un chat de IRC para que nuestros oyentes puedan comentarlo. Buscando maneras de hacerlo he encontrado una que para mi es la mejor. Seguramente haya otras opciones más fáciles pero ya que me ponía a investigar como hacerlo he ido a lo «profesional» (que no, pero ahí queda).
Por el momento he configurado todo en local, utilizando una maquina virtual con Debian de servidor y mi portátil y mi PC de sobremesa como clientes para confirmar que todo funciona correctamente. Esto cuando lo acabemos de configurar en un servidor «real» seguramente nos de algún problema y lo dejaremos todo por aquí escrito.
Para evitar textos largos de configuraciones he creído que lo más oportuno sería poner trozos de código pequeños que sean relativamente importantes y poner los ficheros de configuración completos en Snippets en mi Gitlab.
¡Vamos al asunto!
Herramientas necesarias
- Un servidor de Icecast2 en funcionamiento
- Un servidor de mumble
- 2 ordenadores con el cliente de Mumble instalado (al primero lo llamaremos Streamer y al segundo Talker). Además es importante que estos dos ordenadores tengan pulseaudio instalado.
- Darkice, importante para transmitir el audio del mumble al icecast
- Todo este proceso se realiza bajo root y en un servidor Debian 8.6
Instalación de Icecast2
Lo primero de todo es instalar Icecast2 desde los repositorios de Debian:
# apt install icecast2
Durante la instalación te pide configurar el servicio de audio, yo lo he configurado tal y como se muestra en estas imágenes de abajo:
Nota: Es importante que si estamos usando un servidor con nombre, en vez de usar localhost uséis el dominio. Para facilitar la faena también es mejor poner la IP.
Esta configuración generará el fichero /etc/icecast2/icecast.xml que si todo ha ido bien contendrá la configuración. Si no es así tocará editarlo (a mi me ha pasado esto).
El fichero de configuración completo lo tenéis aquí y este trozo de código es importante:
<authentication> <!-- Para el usuario source --> <source-password>linux</source-password> <!-- Para el usuario relay --> <relay-password>linux</relay-password> <!-- Usuario y contraseña de la app web para controlar Icecast --> <admin-user>admin</admin-user> <admin-password>linux</admin-password> </authentication>
También es importante el hostname y el puerto por donde escuchará:
<hostname>192.168.1.21</hostname> <listen-socket> <port>8000</port> <!-- <bind-address>127.0.0.1</bind-address> --> <!-- <shoutcast-mount>/stream</shoutcast-mount> --> </listen-socket>
Editamos el fichero /etc/default/icecast2 para habilitar el servicio en init.d, modificando el parámetro ENABLE a true:
ENABLE=true
Activamos el servicio para el arranque:
# systemctl enable icecast2
Y finalmente, iniciamos para cargar el la nueva configuración:
# systemctl start icecast2
Ahora desde un navegador cualquier abrimos la página IPserver:8000:
Listo, ya tenemos un servidor Icecast2 instalado. ahora toca configurar otra cosa.
Instalar Ices2 como cliente
Una vez tenemos Icecast2 instalado, lo siguiente será configurar Ices2 para añadir puntos de montaje de audios en nuestro servidor de audio. Para ello nos instalamos el paquete ices2 desde los repositorios:
# apt install ices2 vorbis-tools
Por defecto, Ices2 no crea un fichero de configuración, para ello crearemos un directorio en /etc y añadiremos unas plantillas que hay en la documentación de Ices2.
Creamos el directorio:
# mkdir /etc/ices2
Y luego copiaremos la plantilla:
# cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2/
Lo siguiente será crear un directorio para guardar el fichero del registro del servicio Ices2:
# mkdir /var/log/ices2 # touch /var/log/ices2/ices.log # chmod 755 -R /var/log/ices2
Y ahora toca modificar el fichero de configuración /etc/ices2/ices2-playlist.xml. Y os cuento que hay que modificar. El fichero es un XML, por lo tanto todo está escrito en ese formato y hay que modificar las etiquetas, así que la configuración es sencilla (pero a la vez es la parte más complicada y la que puede dar más dolores de cabeza).
Lo primero modificamos la etiqueta <background> y cambiar el 0 por un 1. De esta manera el servicio se ejecutará en segundo plano.
Dentro de la etiqueta <stream> tenemos otras etiquetas, primero nos fijaremos en la etiqueta <metadata>. Aquí podremos cambiar el nombre de nuestra radio, el género (si ponemos música) y la descripción de la estación de radio.
Luego nos fijaremos en la etiqueta <input> donde estableceremos la ruta del fichero con la lista de reproducción (atributo file), si queremos que la reproducción sea aleatoria (atributo random, 1=si, 0=no) y si queremos que al acabar se corte la emisión o que siga emitiendo en bucle (atributo once).
Finalmente, en la etiqueta <instance> configuramos el servidor, contraseña de las fuentes y el punto de montaje (un nombre sencillo y acabado en .ogg).
Como siempre, podéis consultar la configuración que he utilizado en este fichero.
Una vez tenemos la configuración, tenemos que crear los ficheros que hemos puesto en dicha configuración. Primero el .ogg (el cual copiamos alguno que tengamos al servidor):
# scp byb.ogg zagur@192.168.1.22:/home/zagur
Y luego añadimos ese fichero al playlist.txt:
# find /home/zagur/ | grep .ogg > /home/zagur/playlist.txt
Este comando añade las rutas de los ficheros .ogg en el fichero playlist.txt. Lo editaremos con nano y añadiremos lo siguiente al final del todo:
stream.ogg
Luego veréis para que es esto. Lo siguiente será ejecutar Ices2 y montar nuestros audios a Icecast con:
# ices2 /etc/ices2/ices-playlist.xml &
Ahora volvemos a nuestro navegador y el 192.168.1.22:8000 tendremos nuestro punto de montaje:
Incluso podremos iniciar VLC para escuchar nuestro audio:
Instalar un servidor Mumble
Ahora toca instalar un servidor Mumble para tener nuestra sala donde grabaremos el audio y podremos hablar con el resto de gente para crear el podcast.
Instalamos el servidor Mumble con:
# apt install mumble-server
Una vez instalado, lo configuramos con:
# dpkg-reconfigure mumble-server
Y listo, ya tenemos nuestro servidor Mumble activo. (Evidentemente, si se quiere profundizar más en Mumble y crear salas y configurarlo a fondo, lo recomendable es utilizar la documentación oficial).
El punto fuerte del proceso
Hago un pequeño parón para explicar que es lo que vamos hacer a continuación. No sin antes hacer un pequeño repaso de lo que hemos realizado. Actualmente tenemos un servidor de sonido con Icecast2 y Ices2 funcionando correctamente. También tenemos un servidor mumble.
Ahora necesitamos dos ordenadores con el cliente de Mumble instalado. Uno para poder hablar, el cual llamaremos a partir de ahora como TALKER y otro para hacer el streaming, el cual llamaremos a partir de ahora como STREAMER. En los dos ordenadores es importante tener instalado PulseAudio.
Luego necesitaremos compilar un programa llamado DarkIce. Este programa lo que hace es coger todo el audio de una interfaz de PulseAudio virtual (o null sink) que crearemos y la envía al Icecast2. De esta manera, todo lo que se diga en Mumble será emitido a Internet. ¿Cómo se hace? Pues vamos a verlo.
Instalación de Mumble Client
Tanto en STREAMER como en TALKER es necesario tener el cliente de mumble instalado. Se instala muy fácil:
# apt install mumble
Preparar PulseAudio y Mumble
Lo primero será crear la interfaz de PulseAudio en STREAMER con lo siguiente:
$ pactl load-module module-null-sink sink_name=stream
Este comando crea una salida de audio virtual llamada stream, que en realidad no apunta a la tarjeta de sonido, pero permite que otros programas puedan capturar el sonido. PulseAudio crea automáticamente lo que se llama como monitor para que esa salida pueda ser utilizado como entrada para otro programa. En este caso se llamará stream.monitor. DarkIce utilizará eso como entrada de audio.
Luego iniciaremos el cliente de Mumble en STREAMER y configuraremos el audio de salida en Configure > Settings > Audio Output y en System escogeremos la opción PulseAudio y en Device la opción Null Output.
Finalmente, nos conectaremos con TALKER a Mumble y además yo, para hacer pruebas, me he conectado también con mi Android. En la imagen de abajo vemos que hay tres usuarios:
- Android: Mi móvil.
- talker: El ordenador que hace de TALKER (y que será donde conectaremos nuestro micro y hablaremos nosotros)
- zagur: Este es el ordenador que hace de STREAMER y que enviará todo el audio a Icecast2. Recomendación de la buena: mutea a este usuario para que no emita sonidos no deseados.
Instalar DarkIce
Ahora lo realmente complicado. Instalamos DarkIce:
# apt install darkice
Si queréis, podéis compilar las fuentes:
# git clone https://github.com/rafael2k/darkice.git
Entramos al directorio y compilamos:
$ cd darkice $ ./autogen.sh $ make # make install
Una vez instalado, tenemos que modificar los ficheros de configuración no sin antes copiar el fichero de ejemplo:
# /usr/local/etc/darkice.cfg /etc/darkice.cfg
Y luego lo editamos. Este fichero, si habéis tocado samba en GNU/Linux, tiene la misma estructura, así que es fácil de editar también.
Vamos a la sección [general] y lo dejamos así:
[general] duration = 0 bufferSecs = 5 reconnect = yes realtime = yes rtprio = 3
En la sección [input], tenemos que cambiar el nombre del device y del SourceName y dejarlo así:
[input] device = pulseaudio sampleRate = 22050 bitsPerSample = 16 channel = 2 paSourceName = stream.monitor
Luego vamos a la sección [icecast2-0], aquí viene lo importante. Modificamos los parámetros:
[icecast2-0] server = 192.168.1.22 port = 8000 password = linux mountPoint = stream.ogg name = BYB RADIO
¿Os acordáis del stream.ogg que añadimos en el fichero playlist.txt cuando configuramos Ices2? El punto de montaje para el «directo» será stream.ogg.
Y para acabar, el momento de la verdad. Ejecutamos:
# darkice -c /etc/darkice.cfg
Y si la configuración es correcta nos debería de aparecer las siguientes líneas:
Using config file: /etc/darkice.cfg Using PulseAudio audio server as input device. Using PulseAudio source: stream.monitor Using POSIX real-time scheduling, priority 3
Si todo funciona bien, iremos de nuevo al navegador y comprobamos que tenemos otro punto de montaje:
Aquí tenemos nuestro DIRECTO. Todo el audio que se reproduzca en Mumble, la interfaz virtual que hemos creado en el PC de STREAMER lo reenviará mediante DarkIce al servidor de sonido IceCast2 y de esta manera podremos emitir nuestros programas en directo.
¿Siguiente paso?
Todo en local, con una maquina virtual, funciona perfectamente. El siguiente paso sería hacer este proceso en un servidor de verdad. Si se sigue todo a rajatabla en teoría no debería de venirse encima ningún problema. Pero claro, he dicho EN TEORÍA.
Hay algo que no me gusta de este método. Y es que el audio que se escucha en Mumble y que STREAMER lo envía a IceCast2, lo guarda en un fichero local llamado dump.ogg y lo va enviando a Icecast2.
Es como si fuera una caché, y el problema que me he encontrado es que hay un retraso importante con el audio que se escucha en Mumble y el «directo». Hay un retraso de entre 2 y 5 minutos. Esto para hacer un podcast en directo es poco profesional.
Aún así, estoy casi seguro que se puede solucionar de alguna manera. Hay un manual extenso de DarkIce que seguro que se puede configurar de alguna manera para que esto no suceda.
Fuentes utilizadas: Mumble Icecast
Ningún comentario “Emitir audio de Mumble en servidor IceCast #RadiosLibres”