Una radio en Linux

 

 

Diagrama de una radio por internet

Esta vez se trata de armar una radio por Internet. Queremos que nuestra transmisión analógica se pueda escuchar por Internet. Para eso como siempre usamos Linux y nuestra queridad distribución Debian en su versión Etch (bueno o la que tengan a mano si no les gusta Debian). Si estamos hablando de radio por Internet, entonces estamos hablando de streaming.

¿Qué es el streaming?

El streaming de audio es sencillamente la transmisión de audio digitalizado y codificado que se reproduce en el cliente en vivo. O sea no hace falta descargar todo el archivo desde el servidor para escucharlo sino que se eschucha a medida que se descarga. El streaming es la técnica que utilizan las radios por internet, aunque también se aplica al video.

El formato en que se envían las transmisiones de audio suele ser el famoso mp3, pero también podemos codificar en otros formatos como por ejemplo ogg. Se puede hacer streaming de audio almacenado en archivos, por ejemplo temas musicales o podcasts que están almacenados en el servidor y se reproducen en el cliente bajo demanda. Pero también, y más interesante, es hacer codifcación en vivo del audio. O sea, en el servidor se toma la entrada de audio analógica, se codifica (en mp3 u ogg, etc.) y luego se envía por Internet para que los clientes escuchen nuestra «radio». Este tipo de streaming es el que vamos a explicar.

Lo que hace falta para levantar un servidor de streaming en Linux

La figura del principio nos muestra qué hace falta para que nuestra radio suene en Internet usando Linux. Nos estamos refiriendo a software; pero obviamente si queremos que en nuestro equipo entre audio analógico debemos disponer de una placa de sonida que tenga una entrada de línea y que esté soportada por el sistema de audio de nuestro sitema operativo.

A continuación, los componentes:

Alsa

Alsa es el sistema de sonido de Linux. Aunque no es el único sistema de sonido que existe, sí es el más difundido y con más amplio desarrollo, y por supuesto soporta la mayor cantidad de hardware de audio.

Alsa se encarga de cargar los módulos del kernel necesarios para que funcione el sonido y los módulos que harán que la placa de sonido sea reconocida y funcione. Además Alsa presenta al sistema un dispositivo mezclador o mixer, que cumple la función de consola de mezclas. Al acceder al mixer podemos ajustar el volumen de los diferentes «canales», por ejemplo el sonido de todo el sistema o master, el volumen del reproductor de cd o el del micrófono.

Una de las funciones del mezclador de sonido que más interesa a la hora de hacer streaming de audio en vivo es la que controla el dispositivo de grabación. En el mezclador se definen varias fuentes de audio que se pueden usar para grabar o capturar audio; por ejemplo el sonido que introducimos a la placa de audio por la entrada de línea, el de un micrófono, o el del cd de audio que está sonando. Todas estas fuentes de audio se pueden digitalizar, pero para ello hay que decirle al sistema de sonido de qué fuente queremos grabar. Otra opción, en el caso de que la placa de sonido lo soporte, es decirle al sistema de sonido que queremos grabar una mezcla de todas las fuentes de audio activas en el momento. Pero siempre hay que tener en cuenta que si no ponemos a grabar la fuente desde la que nos interesa capturar el audio, no podremos transmitir nada en nuestra radio.

Como en nuestro caso el audio es generado afuera del servidor y lo introducimos por la entrada de línea, tendremos que configurar el mezclador para que defina como dispositivo de grabación solo a la entrada de línea.

LAME y DarkIce

DarkIce es un programa fuente de streaming. Los programas fuentes se encargan de proveer el audio que el servidor de streaming ofrecerá a los clientes. Para esto se conectan al servidor de streaming con un usuario y contraseña en un puerto específico e inyectan el audio que ofrecen bajo lo que se llama un punto de montaje, que viene a ser un identificador del audio que están ofreciendo. Un servidor de streaming puede recibir audio de más de un programa servidor como DarkIce.

DarkIce se encarga de todo lo referente a la fuente del audio y la codificación del mismo. Entre otras cosas, en la configuración de DarkIce se debe especificar:

  • La frecuencia de muestreo
  • Los canales que tendrá el audio grabado (mono o estéro)
  • El codec a usar (mp3, ogg, etc)
  • El bitrate, o el ancho de banda que se usará para transmitir el stream de audio

Ahora bien, todo el trabajo de codificación no lo hace DarkIce, sino que este usa un programa externo para ello. Si se quiere transmitir en mp3, el programa es LAME, que es un encoder de mp3. LAME toma los parámetros de configuración que le pasa DarkIce y codifica el audio en mp3, luego se lo devuelve a DarkIce quien lo inyecta en el servidor de streaming.

Icecast2

Icecast2 es el programa de streaming propiamente dicho. Este servidor se encarga de gestionar las peticiones de los clientes que piden las transmsiones de audio. Icecast puede manejar varias transmisiones a la vez de distintas fuentes de audio. El programa trabaja en su propio puerto (el 8000) pero toda la transmisión la hace usando el protocolo http, por lo cual es bastante transparente a usuario, de forma que no hay que preocuparse de que proxys o gateways que pueda haber en el medio flitren la conexión.

Icecast levanta además una interfaz web desde la cual se puede administrar el servidor y ver los streams de audio disponibles.

Pasos para configurar una radio en Linux usando Debian Etch

Primero que nada debemos asegurarnos de que podemos manejar el audio en nuestro equipo. Necesitaremos hacer funcionar el sistema de sonido de Linux, Alsa. Si no lo tenemos instalado:

# apt-get install alsa alsa-base alsa-utils

Para configurar el sonido corremos el siguiente comando y seguimos las instrucciones:

# alsaconf

Este programa se encargará de detectar nuestra placa de sonido y configurar Alsa para que cada vez que inicie cargue los módulos necesarios en el kernel para que nuestra placa de sonido funcione.

Nos aseguramos también de que el servicio de sonido se levante cada vez que encendamos el equipo:

# rc-update add alsa default

La instalación de DarkIce y de LAME, requiere de un poco más de trabajo. Debido a las políticas de Debian con respecto a software que puede violar patentes LAME no está incluido en los repositorios oficiales y la versión de DarkIce que sí está incluida en los repositorios ha sido compilada sin soporte para mp3. Por lo tanto tendremos que buscar los paquetes necesarios para LAME y recompilar DarkIce con soporte para mp3.

Para instalar LAME, agregamos los repositorios de Debian multimedia a nuestro /etc/apt/sources.list

deb http://www.debian-multimedia.org etch main

Hacemos

# apt-get update

# apt-get install lame liblame-dev

Para DarkIce, nos aseguramos de tener algún repositorio con los fuentes de los paquetes en nuestro sources.list

deb-src http://ftp.debian.org/debian/ etch main contrib non-free

Luego hacemos

# apt-get build-dep darkice

Con lo que se descargarán las fuentes de DarkIce y se instalarán todos los paquetes necesarios para que podamos compilarlo.

Dentro del directorio de los fuentes de DarkIce que se generará, modificamos el archivo que indica cómo debe ser compilado el paquete para Debian. Configuraremos una opción para que incluya el soporte para mp3 a través de LAME

# vi darkice-0.17.1/debian/rules

Nos aseguramos de que esta línea quede así (con el parámetro --with-lame)

DEB_CONFIGURE_EXTRA_FLAGS := --prefix=/usr --sysconfdir=/usr/share/doc/darkice/examples --with-lame

Para compilarlo y empaquetarlo hacemos:

# apt-get source --build darkice

Instalamos luego el archivo .deb resultante

# apt-get install darkice_0.17.1-3_i386.deb

y listo, ya tenemos DarkIce con soporte para mp3.

Como último detalle debemos recordar no actualizar DarkIce desde los repositorios oficales, para no perder los cambios, o recompilarlo de la misma manera cada vez que aparezca una nueva versión.

Ahora que el software está instalado vamos a configurarlo. Empezamos por Icecast2. Modificamos /etc/icecast2/icecast.xml

<authentication>
<!-- Sources log in with username 'source' -->
<source-password>sourcepass</source-password>
<!-- Relays log in username 'relay' -->
<relay-password>hackme</relay-password>


<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>adminpass</admin-password>
</authentication>

Definimos dos usuarios, con sus respectivas contraseñas. Por un lado el usuario del programa fuente; luego configuraremos DarkIce con esa contraseña para que se conecte a Icecast2. Por otro lado el usuario administrador, que es el usuario que utilizaremos para controlar Icecast2 por la interfaz web que posee. Con esta configuración nos basta para que Icecast2 funcione como queremos.

La mayor parte de la configuaración de nuestro stream de audio la tendremos que definir en la configuración de DarkIce.

DarkIce no se instala como un servicio, y no trae un archivo de configuración por defecto, por lo cual tendremos que copiar el que viene en la documentación y modificarlo a nuestro gusto

# cp /usr/share/doc/darkice/examples/darkice.cfg /etc

El archivo es de tipo .inf y se divide en una sección general, otra que define la entrada de audio (input) y varias secciones de ejemplo con la configuración para diferentes clases de servidores de streaming de audio. Como nos interesa Icecast2, borramos todas las que no se ajusten a este servidor.

Las diferentes secciones deberían quedar así:

[general]
duration = 0


bufferSecs = 5

reconnect = yes

Nos interesa el parámetro duration, donde ponemos como valor «0» (cero) para que DarkIce no ponga duración a la transmisión, sino que sea indefinida.

[input]
device = /dev/dsp
sampleRate = 44100
bitsPerSample = 16
channel = 2

La opción sampleRate indica el muestreo que se hará sobre el audio al codificarlo. Mientras más muestras por segundo se tomen del audio para pasarlo de analógico a digital, mejor será la calidad del sonido. Pero debemos tener en cuenta que si subimos la calidad también aumentará la cantidad de datos codificados, y quizás tengamos que aumentar el bitrate o ancho de banda de la transmisión.

Si queremos que nuestro audio sea codificado y transmitido en estéreo debemos configurar el valor de channel en 2.

[icecast2-0]
bitrateMode = abr


format = mp3

bitrate = 128

server = localhost

port = 8000

password = sourcepass

mountPoint = fmlinux

name = Radio GNU/Linux

description = Una radio especial

url = http://www.radio-linux.com

genre = radio

public = yes

En esta sección configuramos la conexión con el servidor Icecast2. Ponemos la dirección ip o nombre de nuestro servidor que en nuestro ejemplo funciona en el mismo host. El puerto por defecto es el 8000, pero dependiendo de la configuranción podría ser cualquier otro.

El password debe coincidir con el que pusimos en la configuración de Icecast2 para el programa fuente. Definimos también que el formato sea mp3 para que DarkIce sepa que encoder utilizar (otra opción es codificar en ogg). El punto de montaje, es el nombre con el que se identificará a nuestra transmisión en el servidor de streaming, por eso debemos ponerle un nombre que sea descriptivo.

El bitrate, se refiere al ancho de banda que va a necesitar el stream de audio para ser transmitido. Si queremos más calidad podemos aumentar el bitrate, pero desde luego no podemos limitarlo indefinidamente, ya que necesitaremos disponer de mucho ancho de banda de subida en nuestro servidor y de bajada en el cliente.

Antes de poner todo a andar debemos asegurarnos de que en el mezclador del sistema de sonido (Alsa) la entrada de línea sea el dispositivo elegido para grabar. Podemos usar alsamixer para configurar de forma gráfica el audio. Dentro de alsamixer presionamos F4 y se nos muestran los controles de grabación.

Para nuestra tarjeta de sonido (una Intel High Definition Audio), estos son los controles que se nos muestran:

alasmixer

Como vemos, tenemos que definir dos cosas: Que la entrada de línea este grabando, identificado en rojo con la palabra CAPTUR (de no ser así, con la barra espaciadora lo cambiamos), y por otro lado que el nivel del volumen para la captura esté lo suficientemente alto.

Alsa guarda los valores del mezclador y los reestablece cada vez que se inicia. De cualquier forma podemos usar el comando amixer en algún script si queremos poner a mano los valores del mezclador. Aunque hay que reconocer que el comando amixer es bastante más difícil de utilizar que alsamixer, ya que no es gráfico.

Si todo ha ido bien, solo tenemos que levantar los servicios. Para levantar Icecast2 primero editamos /etc/default/icecast2 y habilitamos el servicio.

ENABLE=true

luego hacemos

# /etc/init.d/icecast2 start

DarkIce no corre como servicio por lo que tendremos que ejecutarlo a mano e indicarle dónde buscar el archivo de configuración. Agregamos un «&» al final para que corra en background.

# darkice -c /etc/darkice.cfg &

Luego podemos crear un script que corra al inicio del sistema para que se inicie DarkIce con estos parámetros.

Para verificar que todo anda, nos conectamos al servidor web que levanta Icecast2 usando un navegador.

http://localhost:8000

Desde allí podremos ver las transmisiones que el servidor ofrece y si entramos en la parte de administración con el password que pusimos en la configuración de Icecast2, podremos ver los programas fuentes conectados.

Pero como la prueba definitva para saber si el servidor funciona es escuchar el audio, nos conectamos con un cliente al servidor. Usamos cualquier programa de reproducción de audio que soporte streaming (algunos: xmms, winamp, quod-libet, rythmbox, vlc, kaffeine). Nosotros usaremos mplayer, ya que ni siquiera tendermos que abrir la parte gráfica. Tenemos en cuenta que debemos usar el puerto 8000 e indicar el punto de montaje (en nuestro caso habíamos definido fmlinux).

# mplayer http://www.radio-linux.com:8000/fmlinux

Si todo va bien, deberíamos ver como después de unos segundos que mplayer tarda en cargar el búfer de audio, nuestra transmsión suena en el equipo cliente.

Esto es todo, ahora podemos dedicarnos a sintonizar nuestra radio y a gastar ancho de banda en ociosidades y demás que para eso pasamos tanto tiempo configurandolo…

Links sobre el tema

Página oficial de Icecast2

Página oficial de DarkIce

Página oficial de Alsa

Página oficial de LAME 

Blog con detalles para recompilar DarkIce con soporte Mp3 

Explore posts in the same categories: audio, Debian, Linux, streaming

17 comentarios en “Una radio en Linux”

  1. IVONE DE MORALES Says:

    SOMOS UNA EMPRESA DE MONITOREO DE MEDIOS PUBLICITARIOS, DIARIAMENTE GRABAMOS 10 RADIOS DURANTE 13 HORAS ININTERRUMPLIDAS, TAMBIÈN GRABAMOS TELEVISION. NECESITAOS QUE NOS ENVIÈN INFORMACIÒN SI TIENE ALGUN SOTWARE PARA ESTE TIPO DE GRABACION.

    GRACIAS
    GUATEMALA TEL. 502 2 24763070

  2. Kiko Says:

    Hola,

    Lo primero felicitarte por el artículo, me ha servido casi a la perfección, lo único que he cambiado ha sido el formato, en lugar de mp3 he puesto Ogg Vorbis, por el tema de las patentes.

    El único problema que tengo (seguro que es una chorrada) es en la captura del sonido, que me captura además de la entrada de línea todo lo que se reproduce por el ordenador, entonces, si lo escucho en ese ordenador, me produce un remix que no veas …

    En los controles de volumen (gnome-alsamixer) tengo puesto: Line sólo captura (no reproducción) y capture marcada (si no no coge nada), de grabación ninguno más. No se si es que no se ven o es que no se puede hacer ….

    Un saludo

  3. federicosayd Says:

    @Kiko

    Tendrías que fijarte que no haya una opción que diga mezcla, a veces representada con un checkbox. Esto varía en función de la placa de sonido que tengas. ¿Qué modelo es? Cada una tiene lineas y opciones diferentes ya que varía con las prestaciones del hardware.

    Si juegas con los controles del mezclador seguro encontrarás como activar solo la captura de la línea.

    Saludos

  4. Kiko Says:

    Hola de nuevo,

    gracias por tu respuesta, tenías razón, tocando los controles de volumen del alsamixer (también probé con gnome-alsamixer) ya lo captura bien, sin el eco dichoso. Lo que no se es que volumen es el que toqué para que funcionase, por que toqué todos, pero funciona, y no quiero cambiarlo para probar …

    Gracias por tu ayuda

    Kiko

  5. Killeranaya Says:

    «UNA MUY BUENA SOLUCION»

    Hey carnales, yo soy programador de C y C++, estudio ingeniería en computación en la Universidad Autónoma de Baja California (México) y también soy radio aficionado, tengo mi propia estación de radio por internet, y junto con mis amigos transmitimos desde ahi (www.Radiowebcero.net), la verdad soy usuario de GNU/Linux, pero me e visto forzado a utilizar windows para poder realizar mis transmisión, esto por falta de programas tanto buenos como completos de transmisión para GNU/Linux, es por eso que estoy pasando este mensaje atravez de foros y correos electrónicos, en el que hago cita a todos aquellos que también estén artos de esto como yo, y que estén interesados en ayudarme a crear un programa totalmente gratuito para poder transmitir desde GNU/Linux, y que no tenga nada que envidiarle a software privativos como Sam Broadcaster entre o otros, quienes estén interesado en desarrollar este software junto con migo, pueden comunicarse a mi correo personal «killeranaya@gmail.com» para cualquier información. Próximamente, are un sitio en la web para poder realizar este proyecto de forma mas completa, como sea yo se los are saber a su debido tiempo.

    Y recuerden que antes que nada, somos usuarios de GNU/Linux, un sistema hecho por y para usuarios, y la única forma de romper las barreras de migración de aberraciones y vergüenzas informáticas como lo es windows, a sistemas libres y estables como GNU/Linux, es creando soluciones gratuitas de todo tipo de software, así que esta invitación es para programadores en general, no solo aquellos que gozan de este hobie de la radio locución, de preferencia invito a a programadores de lenguajes C y C++, ya que para mi seria mas fácil utilizar estos lenguajes, pero la invitación es libre para cualquiera. Es importante crear soluciones gratuitas para nuestros sistemas, antes de que al vernos en necesidad, software privativos quieran aprovecharse de nosotros y nos quieran obligar a pagar licencias por utilizar adaptaciones de sus software a nuestro sistema libre, si de por si, ya es vergüenza que dentro de nosotros aya quienes lo hacen. En fin eso es punto y aparte.

    Así que ya saben, la invitación es libre, y si no eres programador, no te preocupes, puedes colaborar dándonos ideas y sugiriendo nuevas funciones, ya que a nosotros no se nos puede ocurrir todo.

    Esperando su respuesta, se despide de ustedes el Killeranaya. Y recuerden: «El Software es como el sexo, es mejor cuando es Gratis»


  6. […] – Wikipedia, la enciclopedia libreUna radio en Linux « Bitácora de abordo de federico Compartilo­: These icons link to social bookmarking sites where readers can share and discover […]


  7. […] Cómo queremos promover y masificar el uso de Linux, si antes de comenzar a utilizar una distro, le indicamos que debe aprender y tal vez memorizar varios comandos (por ejemplo Comandos útiles e imprescindibles para el que quiera aprender más o Una radio en Linux). […]


  8. […] Estudiolivre Webdeubuntu.es Labuenanoticia. Federicosayd Agosto 30th, 2008 in Trash | tags: linnux, […]

  9. Eduardo Says:

    Hola que tal, antes que nada felicitaciones por tan buen post y en segundo lugar como ya mencionaste por ejemplo, en caso de que estemos en una emisión en vivo lo que yo entiendo que hace este servidor es recibe la señal analogica la codifica en mp3 y permite por medio de darkice alimentar a icecast, pero no se si por medio de alguno de estos programas se este grabando el audio y se pueda almacenar en el mismo servidor, para así en caso de que nuestros usuarios se hayan perdido algún programa en vivo puedan acceder a ese archivo, no se si me explique, espero que si :p, te agradecería tu respuesta.

    Saludos.

    • federicosayd Says:

      @Eduardo

      DarkIce solo encodea el audio, lo que puedes hacer es conectarte en el mismo servidor con mplayer y poner a grabar el streaming. Incluso puedes programarlo con el cron.

  10. Alexkaiser Says:

    Hola, muy buenas, Federico. Excelente post, estaba buscando algo similar desde hace tiempo pero no salía con las palabras ‘normales’ en las búsquedas en Google. Finalmente lo pude encontrar y tengo una duda.

    Cuando configuras todo esto, haces que tu ordenador sea el servidor de datos para los oyentes, pero… ¿la configuración es exactamente la misma si desde tu equipo sirves los datos a un server externo alquilado (ejemplo: servidores de radio dedicados estilo ShoutCheap con Centovacast o Ibericahost con PanelStreaming), y la gente se conecta a ese server para escuchar la estación de radio?.

    Es que no me queda claro ese punto, ya que esto está pensado como arquitectura Cliente-Servidor, aunque en ciertos casos sería hasta más recomendable alquilar ese server para no saturar al emisor propiamente dicho.

    Espero no ser muy redundante en la pregunta ni muy pesado. Gracias por la atención, un saludo y enhorabuena por el post.

    • federicosayd Says:

      Hola Alexkaiser:

      ShoutCheap por ejemplo tiene sus propios servidores Icecast para hacer el streaming. Puedes usar darkice directamente para encodear el audio y entregárselo al servidor Icecast de ShoutCheap. Además Darkice también soporta conexiones con conexiones ShoutCast. En la configuración de Darkice tendrás que poner como «server» la ip o el nombre del host que te entregue el servicio de Streaming que contrates.

  11. julio Says:

    Lo que no me queda claro es cuantas conexiones a un servidor se pueden lograr con una conexion de 512mb. Gracias.


  12. […] Una radio en Linux « Bitácora de abordo de federico […]


Replica a federicosayd Cancelar la respuesta