2010-05-22

Crear una emisora web con Icecast 2 e Ices 2 en Ubuntu

Bueno, en este pequeño tutorial enseñaré como crear una emisora Web en Ubuntu usando icecast2 como servidor de emisión e ices2 como fuente para el servidor. Aunque esto se puede hacer en cualquier distribución de linux yo recomiendo un ubuntu. Yo lo hice con kubuntu 9.10 (karmik).

Instalar los paquetes

Bueno, lo primero es instalar los paquetes que se van a necesitar para la emisora. Si prefieres usar un administrador de paquetes gráfico como synaptic o adept no hay problema, de todos modos dejo aquí el código de la consola para lograrlo. Los paquetes que necesitaras son icecast2 e ices2

$ sudo apt-get install icecast2 ices2

Configurar la emisora

Preparar Icecast

Primero prepararemos icecast. Icecast utiliza un archivo de configuración xml donde están todos los parámetros de la emisora además de unos archivos para la interfaz web, unos archivos predeterminados se instalan con los paquetes, hay que hacer una copia de ellos en el directorio del usuario por que no se debe ejecutar icecast como root.
 

Primero crearemos una estructura de directorios para albergar los archivos de configuración y de registro de icecast, estando en nuestro home ejecutamos:

$ mkdir icecast
$ cd icecast
$ mkdir conf
$ mkdir logs

Ahora copiamos el archivo de configuración predeterminado del icecast a la carpeta que hemos creado. en kubuntu dicho archivo es /etc/icecast2/icecast.xml Si el archivo no esta allí entonces puedes usar el comando find para encontrarlo así:

$ find / -name "icecast.xml"

Nota: en algunas distribuciones de linux las carpetas del sistema están protegidas, los usuarios no pueden acceder a ellas (ni siquiera para leerlas) si este es tu caso deberás usar sudo cuando el sistema te diga que no puedes leer los archivos

$ cd conf
$ cp /etc/icecast2/icecast.xml icecast.xml
$ sudo chown user:group icecast.xml

Dado que el archivo pertenecía al root hemos usado chown para hacer que ahora nos pertenezca a nosotros. ¡Ojo aquí! donde he colocado user y group debes colocar tu nombre de usuario y de grupo respectivamente, en ubuntu normalmente el nombre del grupo es igual al nombre de usuario, en mi caso por ejemplo tanto mi usuario como mi grupo se llaman sergio así que el comando quedaría: sudo chown sergio:sergio icecast.xml
 

Por ahora no modificaremos el archivo de configuración, antes de eso copiaremos las carpetas que el icecast utiliza para la interfaz web. Estas carpetas normalmente están ubicadas en /usr/share/icecast2 pero si no están allí recuerda que puedes usar el comando find para localizarlas.

$ cd ..
$ cp -r -L /usr/share/icecast2/web web
$ cp -r -L /usr/share/icecast2/admin admin
$ sudo chown -R user:group admin
$ sudo chown -R user:group web

Recuerda remplazar user y group por tu nombre de usuario y de grupo respectivamente.
 

Ok, ahora si configuraremos el icecast para ello modificaremos el archivo de configuración que hemos copiado:

$ cd conf
$ kate icecast.xml

Si no tienes kate puedes usar gedit u otro editor pero trata en lo posible de usar un editor que te resalte el código para que se te haga más sencillo ubicar las líneas.
 

Bueno, vamos a ir editando las líneas en el orden en el que aparecen en el archivo, así que estate atento.

<clients>10</clients>

Esta línea fija la cantidad máxima de clientes (reproductores) que se pueden conectar a tu emisora. Normalmente esto se ajusta de acuerdo con la cantidad de ancho de banda del que dispones para emitir. Un valor razonable es 50. Si esperas más de 50 clientes quizás este tutorial no es para ti.

<source-password>hackme</source-password>

En esta línea colocaras la contraseña que las fuentes (en nuestro caso el ices2) utilizará para logearse en el servidor y enviar la música. Es recomendable que cambies la contraseña predeterminada para evitar que alguien más pueda emitir con tu servidor.

<relay-password>hackme</relay-password>

En nuestro caso no usaremos relays pero debes cambiar esta contraseña por seguridad.

<admin-user>admin</admin-user>
<admin-password>hackme</admin-password>

Este es el nombre de usuario y la contraseña que utilizaras para logearte en el módulo de administración web de Icecast. Te recomiendo que cambies tanto el nombre de usuario como la contraseña por seguridad.

<hostname>localhost</hostname>

Si tu emisora está montada en un servidor al que accedes con un dominio que has adquirido aquí colocaras el nombre del dominio, por ejemplo miradio.org. Si estás montando un servidor de pruebas te bastara con dejar localhost.

<port>8000</port>

Este es el puerto por el que emitirás. Normalmente no hay que cambiar el puerto a menos que tengas restricciones de firewall o algo parecido.

<logdir>/home/user/icecast/logs</logdir>
<webroot>/home/user/icecast/web</webroot>
<adminroot>/home/user/icecast/admin</adminroot>

Estas tres líneas le dicen al icecast donde guardar sus registros, donde están los archivos del panel de interfaz web y donde están los archivos del panel de administración de la interfaz web. Aca he colocado las rutas que deberías usar tu también si has seguido el tutorial, recuerda cambiar user por tu nombre de usuario.
 

Ok, en teoría ya está todo listo para que Icecast funcione. Ahora a probarlo.

Ejecutar Icecast

Bueno, ahora probaremos que todo esté funcionando, ejecutamos este comando:

$ icecast2 -c icecast.xml

Si la consola no arroja ningun error entonces Icecast ya está corriendo, ahora verificaremos los logs y la interfaz web para ver que todo esté andando bien.
 

Nota importante: La consola quedará bloqueada con el Icecast NO vayas a cerrar la consola o harás caer el servidor, dejala allí abierta, abre otra ventana o pestaña de consola para hacer los pasos que siguen.

Estando en nuestro home ejecutamos:

$ cd icecast
$ cd logs
$ cat error.log

Debes ver algo como esto:

[2010-05-22 13:08:33] INFO main/main Icecast 2.3.2 server started
[2010-05-22 13:08:33] INFO yp/yp_update_thread YP update thread started
[2010-05-22 13:08:33] INFO connection/get_ssl_certificate No SSL capability

No importa si el log es un tanto diferente, en realidad lo que importa es que no haya errores y que aparezca la línea que dice server started
 

Ahora veremos el estado del servidor a través de la interface web. Para ello en un navegador vamos a la dirección http://localhost:8000/ esto nos debe presentar una página de estado del servidor. Recuerda que para entrar a la sección de administración deberas introducir el nombre de usuario y la contraseña que has especificado en <admin-user></admin-user> y <admin-password></admin-password>

Preparar Ices

Bueno ya tienes el servidor corriendo y preparado para aceptar conexiones, no obstante aún no puedes escuchar música, básicamente por que no le has dicho a Icecast que música tocar. En realidad es un poco más complicado, verás:
 

Icecast es el servidor de emisión, el se encarga de aceptar las peticiones entratentes y distribuir el medio a los escuchas que se conecten pero no sabe nada de música ni de listas de reproducción, de ello se encarga el programa al que se denomina fuente (source). Existen varias sources diferentes para el Icecast entre ellas la más básica que es el Ices desarrollado por las mismas personas que desarrollaron el Icecast pero también puedes usar otras fuentes diferentes si lo prefieres, por ejemplo el VLC Player puede actuar como fuente para el Icecast.
 

Para este tutorial usaremos el Ices como fuente para el Icecast ya que es facil y rápido de configurar. Al igual que con el Icecast crearemos una estructura de directorios en el home para organizar los archivos. Esando en el home ejecutamos:

$ mkdir ices
$ cd ices
$ mkdir conf
$ mkdir playlists
$ mkdir logs

Ahora copiaremos el archivo de configuración predeterminado del Ices para usarlo con listas de reproducción. Recuerda que si no encuentras el archivo puedes hacer uso del comando find para localizarlo.

$ cd conf
$ cp /usr/share/doc/ices2/examples/ices-playlist.xml ices.xml
$ kate ices.xml

Ahora editaremos el archivo de configuración del Ices. Recuerda que lo haremos en el orden en que las líneas aparecen en el archivo así que pon mucha atención para no perderte.

<logpath>/home/user/ices/logs</logpath>

Esta línea le dice a Ices donde guardar los archivos de registro. Recuerda remplazar user con tu nombre de usuario.

<name>Example stream name</name>
<genre>Example genre</genre>
<descriptione>A short description of your stream</description>

Estas tres líneas contienen la metadata de la emisora. Sería una buena idea que las llenaras con los datos correctos según el nombre de tu emisora, el genero y la descripción.

<param name="file">/home/user/ices/playlists/playlist.txt</param>

Esta línea le dice al Ices donde encontrar el archivo de lista de reproducción. Más adelante te diré como crear la lista de reproducción. Recuerda remplazar user con tu nombre de usuario

<param name="random">0</param>

Esta línea le dice al Ices si tocar la lista de reproducción secuencialmente o aleatoriamente. Depende de ti establecerlo en el valor que quieras. Si la pones en 1 Ices tocará las entradas aleatoriamente

<param name="once">0</param>

Esta parámetro le dice al Ices si debe tocar la lista de reproducción solo una vez o debe tocarla infinitas veces. Si dejas el valor en 1 Ices tocará la lista de reproducción una vez y cuando termine cerrará la conexión con el servidor y finalizará haciendo que la emisora ya no se pueda escuchar más. Si piensas dejar la emisora corriendo todo el día para que la gente se conecte cuando quiera deberás establecer el valor en 0 para que Ices cicle indefinidamente la lista de reproducción.

<hostname>localhost</hostname>
<port>8000</port>
<password>hackme</password>
<mount>/example1.ogg</mount>

Esta es la información del servidor. Aquí colocamos la información del servidor Icecast a través del cual vamos a emitir. Esta información debe coincidir con la información que ya habíamos configurado en el icecast.xml. en <password></password> colocamos el password que habíamos puesto en la etiqueta <source-password></source-password> de icecast.xml
 

En <mount></mount> debemos escojer el mount point que queramos para emitir. El mount point será la parte final de la URL que usaremos para escuchar la emisora así que no conviene que sea exmaple1.ogg podrías poner en su lugar listen.ogg o tal vez algo más descriptivo pero no debe contener espacios y DEBE terminar en .ogg ya que es el codec que Icecast e Ices usan para emitir si no poner el .ogg algunos players se quedarán colgados sin hacer nada cuando trates de escuchar la estación.

<nominal-bitrate>64000</nominal-bitrate>

Esta el la última configuración pero una muy importante. Define la velocidad de bits con la que emitirá tu emisora. Cuanto mayor la velocidad de bits mejor la calidad del audio pero más ancho de banda necesitas para mantener a todos los oyentes conectados. Si colocas más velocidad de bits de la que puede soportar tu canal para la cantidad de oyentes que esperas los oyentes empezaran a experimentar cortes en la música o peor aún desconexiones espontaneas.
 

Si no estás muy seguro de que bitrate usar deja el bitrate predeterminado que es de 64kbps es una buena calidad para el .ogg al menos para la mayoría de aplicaciones. Si quieres saber más sobre como calcular el ancho de banda que necesitarás lee el recuadro siguiente, sino saltalo.

Cómo calcular el ancho de banda
 

Si no estás muy seguro de como saber cuantos oyentes puede soportar tu canal o cual es el máximo bitrate que puedes usar sin que tus oyentes experimenten problemas esta sección te dará alguna luz sobre ese asunto:
 

Ancho de banda Concurrente
 

El ancho de banda concurrente es la amplitud del canal que necesitas para emitir. Se calcula de la siguiente manera:
 

cb = b*n
 

Dónde cb es el ancho de banda concurrente (en kbps), b es el bitrate al que emites (en kbps) y n la cantidad de oyentes que esperas que se conecten simultaneamente. Así, por ejemplo, si vas a emitir a 128kbps y esperas 50 oyentes simultaneos: cw = 128kbps * 50 = 6400 kbps. Así pues necesitas un canal de 6.4 mbps para soportar 50 simultaneos oyentes si emites a 128kbps
 

Límite de Tráfico
 

Algunos servidores imponen un límite mensual de tráfico y cuando lo sobrepasas o bien empiezan a cobrarte más o bien no te permiten emitir más por el resto del mes. Para saber si tu límite mensual es suficiente para soportar la emisora puedes calcularlo así:
 

tb = b*n*at*30
 

Dónde tb es el ancho de banda total del mes (en kbits), b es el bitrate al que emitirás (en kbps), n es la cantidad de oyentes promedio que esperas por día y at es la cantidad promedio de tiempo que un oyente estará conectado al día (en segundos).
 

Así pues si emitirás a 128kbps, esperas 50 oyentes diarios y cada uno estará conectado en promedio 5 horas diarias escuchando la emisora tendrás:

tb = 128*50*18000*30 = 402.33 GB
 

Necesitarás un límite de tráfico mensual de al menos 400 GB

Ok, ya estas listo con el Ices configurado, ahora a crear la lista de reproducción.

Crear la lista de reproducción

La lista de reproducción es simplemente un archivo en el que cada línea tiene la ruta de acceso a un archivo .ogg, por ejemplo:

/home/user/music/anime/yui - rolling star.ogg
/home/user/music/anime/boa - every heart.ogg
/home/user/music/anime/gumi - catch you catch me.ogg
/home/user/music/anime/porno graffiti - melissa.ogg

Puede resultar un poco engorroso crear la lista a mano así que puedes usar el comando find para agilizar el trabajo, por ejemplo:

$ find /home/user/ -name "*.ogg" > playlist.txt

Este comando escribira en un archivo llamado playlist.txt todos los archivos .ogg que encuentre en la carpeta /home/user/, recuerda nuevamente remplazar user con tu nombre de usuario.

Ejecutar el Ices

En cuanto tengas preparada tu lista de reproducción (que debes haber guardado en /home/user/ices/playlists/playlist.txt) podrás poner en marcha el ices. Para ello haces lo siguiente estando en tu home:

$ cd ices
$ cd conf
$ ices2 ices.xml

Ok, si todo va bien la consola no debe mostrar mensajes de error, si es así el ices ya está corriendo y enviando información de medios al Icecast. Nuevamente la consola quedará bloqueada NO cierres la consola o bajaras al Ices abre otra ventana o pestaña de consola para los pasos siguientes.
 

Vamos a verificar el estado del Ices, para ello, desde nuestro home:

$ cd ices
$ cd logs
$ cat ices.log

Debes ver algo parecido a esto:

[2010-05-22 18:20:55] INFO ices-core/main IceS 2.0.1 started...
[2010-05-22 18:20:55] INFO signals/signal_usr1_handler Metadata update requested
[2010-05-22 18:20:55] INFO playlist-basic/playlist_basic_get_next_filename Loading playlist from file "/home/sergio/ices/playlists/playlist.txt"
[2010-05-22 18:20:55] DBUG playlist-basic/shuffle Playlist has been shuffled
[2010-05-22 18:20:55] INFO playlist-builtin/playlist_read Currently playing "/home/sergio/Música/J-Music/YUI/From Me To You/11.ogg"
[2010-05-22 18:20:55] INFO stream/ices_instance_stream Connected to server: localhost:8000/yui.ogg
[2010-05-22 18:20:55] DBUG reencode/reencode_page Reinitialising reencoder for new logical stream
[2010-05-22 18:20:55] INFO encode/encode_initialise Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 128000

Básicamente lo que debes buscar es una línea como [2010-05-22 18:20:55] INFO playlist-builtin/playlist_read Currently playing "/home/sergio/Música/J-Music/YUI/From Me To You/11.ogg" que te indica que Ices leyó y empezó a emitir uno de los archivos que pusiste en la lista de reproducción.
 

También puedes verificar el estado del servidor desde la interfaz web entrando a http://localhost:8000 allí debe aparecer el mount point que has configurado con la metadata que colocaste en el archivo.

Escuchar la emisora

Ok, por fin el momento que has estado esperando. Escuchar la música que emite la emisora. Ya puedes hacerlo, por ejemplo con el VLC Player:
 

En el menú Medio selecciona Abrir volcado de red, en el cuadro que aparece escribe en el campo de dirección: http://localhost:8000/mount.ogg (remplaza mount.ogg por el mount point que has colocado en <mount></mount> en el archivo ices.xml) y luego haz clic en el botón Reproducir.
 

Si todo va bien escucharás la música que tu emisora emite. ¡Felicitacione!

Detener la emisión

Ok. Ahora te diré como detener la emisión. Recuerdas que dejamos abiertas las consolas del Ices y del Icecast pues bien, para detener la emisión simplemente debes presionar CTRL+C en la consola para detener los programas. Lo más recomendable, claro está, es que detengas primero Ices y luego Icecast por que si lo haces al revés Ices perderá inesperadamente la conexión con el servidor lo cual no es muy recomendable.

Como no bloquear la consola

Es posible ejecutar Icecast e Ices sin que la consola quede bloqueada. Para ello debes ejecutar los comandos agregando un ampersand (&) al final, así:

$ icecast2 -c icecast.xml &
$ ices2 ices.xml &

Al hacerlo de esta manera el sistema responderá con algo parecido a esto:

[1] 2923

Ese número es el pid (id de proceso) del Icecast esté número identifica al proceso en el sistema y es el que necesitas para detener la emisión luego. Si pierdes el número o la emisora ha estado emitiendo por mucho tiempo y ya no lo recuerdas puedes recuperarlo usando el comando:

$ ps ax | grep icecast2

A lo que el sistema responderá con algo como esto:

2329 pts/1 Rl 0:03 icecast2 -c icecast.xml

El primer número que aparece es el pid del Icecast.
 

Para detener la emisión debes enviar al proceso la señal de salida (TERM) lo haces con este comando:

$ kill -15 2923

Aunque kill puede parece algo drástico en realidad ese comando simplemente envía una señal de terminación al proceso, no lo mata forzadamente. Cuando lo hagas verás que el sistema responde con algo como esto:

[1]+ Hecho icecast2 -c icecast.xml

Así sabrás que el proceso ha terminado.

Algunas herramientas utiles

Mp3 a ogg

Cuando se configura una estación de radio con Icecast e Ices una de las preguntas que primero surge es: ¿Cómo convierto un Mp3 a ogg? La respuesta es muy sencilla para nuestro consuelo, para convertir un Mp3 a ogg en linux basta un comando de consola pero antes asegúrate de tener instalados estos paquetes si aún no los tienes:

$ sudo apt-get install mpg321 vorbis-tools

Ahora para convertir un mp3 a ogg:

$ mpg321 music.mp3 -w - | oggenc -o music.ogg -

Creo que eso es por ahora. Si tienen alguna duda o encuentran algún error en el post por favor no duden en dejar un comentario y yo les aclararé cualquier duda que tengan o corregiré lo que sea que esté mal.
 

Más adelante revisaré el post y veré que me falta por aclarar o cambiar. Espero que les haya gustado el tutorial y sobre todo que les haya servido

10 comentarios:

kurkop dijo...

Hola sergio, me gusto mucho tu post, te aseguro de los mejores que he podido encontrar. Tengo una pregunta, si lo que deseo hacer es tener la emisora en internet, mi proverdor de hosting creo queno me da ese servicio de streaming, como hago para emitir desde mi casa y que los demas puedan escucharla (supongo que colocando en vez de localhost la direccion donde quedaria).
Saludos.

Sergio dijo...

No necesitas que el ISP te proporcione ningún servicio especial para poder hacer uso de este herramienta basta con que te permita el acceso al puerto por el cual emites (el puerto 8000).

Simplemente configura el PC para hacer la emisión y luego dile a los escuchas que se conecten a tu dirección IP. Si no sabes cual es tu IP puedes verla en http://www.whatismyip.com/

Ricardo Colmenarez - Fron Venezuela dijo...

Sabes hermano llevo una semana tratando de instalar el Icecast mas que instalarlo correrlo y logre gracias a este blog.

Comento que mi problema fue que estaba como root@ cuando trataba de correr el icecast y se debe correr desde usuario osea usr$ pero el root es solo para instalacion.

Gracias...

Melina y Alberto Bernal dijo...

hola a todos cuado ejecuto este comando para probar es lo que me sale:

beto@beto-MS-7211:~/radio/ices/conf$ icecast2 -c icecast.xml
I/O warning : failed to load external entity "icecast.xml"
FATAL: error parsing config file (icecast.xml)
XML config parsing error
beto@beto-MS-7211:~/radio/ices/conf$

Alguien me puede ayudar..

Sergio dijo...

Bueno, el error lo dice todo:

XML config parsing error

Debes tener algún error en el XML, tal vez cuando estabas introduciendo la configuración borraste un < accidentalmente o introdujiste algún caracter no compatible con XML. Por ejemplo los ampersand (&) no se pueden escribir en los archivos XML, debes escaparlos usando la entidad correspondiente &.

Te sugiero que abras el archivo de configuración en un editor que te resalte el etiquetado, como gedit, kate, geany o cualquier otro editor parecido y lo uses para revisar que el etiquetado esté bien.

Si de todos modos no puedes solucionar el problema envíame tu archivo de configuración a sergio.bobillier@gmail.com y con gusto le daré un vistazo.

Malcom dijo...

¿sabes como configurar icecast2 para que cada cliente de internet acceda al servidor con una password y contraseña?

Malcom dijo...

¿sabes como configurar la emision con password y user para los cliente de internet? es decir que solo puedan acceder al sevidor con password y contraseña

Juan Luis López dijo...

Me gustaría saber como emitir desde un micrófono en directo

Juan Luis López dijo...

Por cierto, el artículo muy completo y todo explicado de forma clara y ordenada. Muy buen trabajo.

Sergio Bobillier dijo...

Juan Luís, para emitir con un micrófono en directo debes usar una fuente diferente al Ices, mi elección es el VLC Media Player que es un gran programa de captura, emisión y recodificación.

En el menú archivo del VLC seleccionas "Abrir dispositivo de captura" y abres tu cámara y micrófono, (por supuesto solamente enviarás el audio a la emisora). Luego en la parte de abajo hay un botón que dice "Reproducir" y tiene una flecha hacia abajo ala derecha, al dar clic en la flecha aparecerán varias opciones, selecciona "Emitir"

En el asistente que aparece podrás seleccionar emitir hacia una emisora IceCast. Introduces la URL de la emisora, el puerto, punto de montaje y usuario y contraseña (que deben ser las de las fuentes, es decir source-password).

Seleccionas la transcodificación, a Audio Vorbis OGG (y si quieres ajusta la taza de bits) e inicias la emisión.

Si conectas una consola de mezcla a tu PC podrás emitir de una forma bastante profesional.