miércoles, 30 de enero de 2013

Cómo configurar un servidor de streaming con Icecast

Como vimos en el post Icecast, un simple, completo y libre servidor de streaming, Icecast es un excelente servidor de streaming y además es software libre. Ahora veremos cómo configurarlo bajo CentOS, de forma sencilla y con streaming en formato OGG y MP3, y de la mejor manera: Usando una máquina virtual. Yo usaré VirtualBox, pero puedes usar la plataforma de virtualización de tu preferencia.

Configuraremos un CentOS 6.3 minimal con solo una interfaz de red y todo lo demás por defecto, excepto eth0 que va bridged a la LAN (192.168.24.0/24).

Así que, manos a la obra....

Al finalizar la instalación y loguearnos por primera vez en el servidor cambiamos el hostname del mismo.
[root@localhost ~]# sed -i 's/HOSTNAME=localhost.local/HOSTNAME=icecastsrv01.local/g' /etc/sysconfig/network
[root@localhost ~]# reboot
Al regresar, deshabilitamos Selinux para evitar inconvenientes hasta nuevo aviso.
[root@icecastsrv01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
También agregamos la siguiente regla de iptables para que nos permita el acceso a Icecast en el puerto 8000.
[root@icecastsrv01 ~]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
[root@icecastsrv01 ~]# service iptables save
[root@icecastsrv01 ~]# service iptables restart
Configuramos la Interfaz de red para actualizar y descargar paquetes. Esta interfaz está Bridged en la configuración de la máquina virtual, por lo que editaremos el script ya que nos interesa que el dhclient nos genere el fichero resolv.conf y reiniciamos.
[root@icecastsrv01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"

[root@icecastsrv01 ~]# reboot
Al regresar actualizamos e instalamos los paquetes necesarios para tener nuestro servidor de streaming. First get the software:
[root@icecastsrv01 ~]# yum update -y
[root@icecastsrv01 ~]# yum groupinstall -y "Development Tools"
[root@icecastsrv01 ~]# yum install -y wget libshout-devel curl-devel libtheora-devel libvorbis-devel libxslt-devel speex-devel libxslt
[root@icecastsrv01 ~]# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
[root@icecastsrv01 ~]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
[root@icecastsrv01 ~]# rpm -i rpmforge-release-0.5.2-2.el6.rf.i686.rpm
Descargar e instalar Icecast 2
[root@icecastsrv01 ~]# mkdir -p /usr/src/icecast
[root@icecastsrv01 ~]# cd /usr/src/icecast
[root@icecastsrv01 icecast]# wget http://downloads.xiph.org/releases/icecast/icecast-2.3.3.tar.gz 
[root@icecastsrv01 icecast]# tar xf icecast-2.3.3.tar.gz
[root@icecastsrv01 ~]# cd icecast-2.3.3 
[root@icecastsrv01 icecast-2.3.3]# ./configure --prefix=/opt/icecast/2.3.3 
[root@icecastsrv01 icecast-2.3.3]# make 
[root@icecastsrv01 icecast-2.3.3]# make install 
Verificamos que haya sido satisfactorio el proceso anterior
[root@icecastsrv01 ~]# ls /opt/icecast/2.3.3/bin/ 
icecast
Creamos un enlace del directorio 2.2.3 dentro del mismo directorio icecast
[root@icecastsrv01 ~]# cd /opt/icecast
[root@icecastsrv01 icecast]# ln -s 2.3.3 latest 
Ahora editamos una copia del fichero xml de configuración del servidor Icecast
[root@icecastsrv01 ~]# cd /opt/icecast/latest/etc
[root@icecastsrv01 etc]# mv icecast.xml icecast.xml.orig
[root@icecastsrv01 etc]# vi icecast.xml 
<icecast>
     <!-- LIMITS -->
     <limits>
       <clients>100</clients>
       <sources>10</sources>
       <threadpool>5</threadpool>
       <queue-size>524288</queue-size>
       <client-timeout>30</client-timeout>
       <header-timeout>15</header-timeout>
       <source-timeout>10</source-timeout>
       <burst-on-connect>1</burst-on-connect>
       <burst-size>65535</burst-size>
     </limits>
   
     <!-- GENRIC -->
     <authentication>
       <source-password>password</source-password>
       <admin-user>admin</admin-user>
       <admin-password>password</admin-password>
     </authentication>
     <hostname>192.168.24.102</hostname>
     <listen-socket>
       <port>8000</port>
     </listen-socket>
     <fileserve>1</fileserve>
   
     <!-- PATHES -->
     <paths>
       <basedir>/opt/icecast/latest/share/icecast</basedir>
       <webroot>/opt/icecast/latest/share/icecast/web</webroot>
       <adminroot>/opt/icecast/latest/share/icecast/admin</adminroot>
       <logdir>/var/log/icecast</logdir>
       <pidfile>/var/run/icecast/icecast.pid</pidfile>
       <alias source="/" dest="/status.xsl"/>
     </paths>
   
     <!-- LOG -->
     <logging>
       <accesslog>access.log</accesslog>
       <errorlog>error.log</errorlog>
       <playlistlog>playlist.log</playlistlog>
       <loglevel>1</loglevel>
       <logsize>10000</logsize>
       <logarchive>1</logarchive>
     </logging>
   
     <!-- SECURITY -->
     <security>
       <chroot>0</chroot>
       <changeowner>
         <user>icecast</user>
         <group>icecast</group>
       </changeowner>
     </security>
</icecast> 
Viendo el fichero icecast.xml en detalle, tenemos:
  • La sección LIMITS define el máximo de estaciones de radio a proveer (sources=10), cuántos clientes pueden conectarse (clients=100), etc. 
  • La sección GENERIC define el usuario, IP y puerto del servidor mismo. 
  • La sección PATHES define las rutas a la interfaz web que es muy simple. 
  • La sección LOGGING define dónde escribirá los logs de Icecast y qué se almacenará en los mismos.
  • La sección SECURITY define el usuario y grupo que ejecutará Icecast. Generalmente se usa el usuario icecast, el cual crearemos más adelante.

Para que Icecast funcione correctamente solo nos faltan algunos ajustes. 

Ahora vamos a crear el usuario y grupo que figuran en icecast.xml. Crearemos también los directorios para los log y el PID del proceso.
[root@icecastsrv01 ~]# groupadd -g 200 icecast
[root@icecastsrv01 ~]# useradd -d /var/log/icecast -m -g icecast -s /bin/bash -u 200 icecast
[root@icecastsrv01 ~]# mkdir -p /var/run/icecast
[root@icecastsrv01 ~]# chown -R icecast:icecast /var/run/icecast
Finalmente probamos Icecast
[root@icecastsrv01 ~]# /opt/icecast/latest/bin/icecast -c /opt/icecast/latest/etc/icecast.xml -b
Starting icecast2
Detaching from the console
Changed groupid to 200.
Changed userid to 200.
En este punto podemos confirmar que los ficheros para los logs se han creado correctamente.
[root@icecastsrv01 ~]# ls /var/log/icecast/
access.log  error.log  playlist.log
Y verificamos que realmente se está ejecutando el servicio:
[root@icecastsrv01 ~]# pgrep -fl icecast
4874 /opt/icecast/latest/bin/icecast -c /opt/icecast/latest/etc/icecast.xml -b
Además Icecast es accesible desde su interfaz web en la dirección IP del servidor http://192.168.24.102:8000/, la cual podemos administrar entrando con el usuario y contraseña definidos en el fichero icecast.xml. 

Configurando los clientes de streaming 

Tener el servidor funcionando no es suficiente. Es necesario además un cliente de streaming en algún formato de audio. 

Ahora veremos cómo dejar funcionando Ices, un cliente de streaming en formato OGG/Vorbis, el cual también necesita la ayuda de la librería libshout. 

Configurando Libshout
[root@icecastsrv01 ~]# cd /usr/src/icecast
[root@icecastsrv01 icecast]# wget http://downloads.us.xiph.org/releases/libshout/libshout-2.3.1.tar.gz
[root@icecastsrv01 icecast]# tar xf libshout-2.3.1.tar.gz
[root@icecastsrv01 icecast]# cd libshout-2.3.1
[root@icecastsrv01 libshout-2.3.1]# ./configure --prefix=/opt/icecast/latest
[root@icecastsrv01 libshout-2.3.1]# make 
[root@icecastsrv01 libshout-2.3.1]# make install
Configurando Ices
[root@icecastsrv01 libshout-2.3.1]# cd /usr/src/icecast
[root@icecastsrv01 icecast]# wget http://downloads.us.xiph.org/releases/ices/ices-2.0.2.tar.bz2
[root@icecastsrv01 icecast]# tar xf ices-2.0.2.tar.bz2
[root@icecastsrv01 icecast]# cd ices-2.0.2/
[root@icecastsrv01 ices-2.0.2]# export PKG_CONFIG_PATH=/opt/icecast/latest/lib/pkgconfig:$PKG_CONFIG_PATH
[root@icecastsrv01 ices-2.0.2]# ./configure --prefix=/opt/icecast/latest
[root@icecastsrv01 ices-2.0.2]# make 
[root@icecastsrv01 ices-2.0.2]# make install
Revisamos que se haya instalado correctamente
[root@icecastsrv01 ~]# ls /opt/icecast/latest/bin/
icecast  ices
Ahora procedemos a editar el fichero de configuración de Ices
[root@icecastsrv01 ~]# cd /opt/icecast/latest/etc/
[root@icecastsrv01 etc]# vi ices1.xml
<ices>
   
     <!-- GENERIC -->
     <background>1</background>
     <pidfile>/var/run/icecast/ices1.pid</pidfile>
   
     <!-- LOGGING -->
     <logpath>/var/log/icecast</logpath>
     <logfile>ices1.log</logfile>
     <logsize>2048</logsize>
     <loglevel>3</loglevel>
     <consolelog>0</consolelog>
   
     <!-- STREAM -->
     <stream>
       <metadata>
         <name>RadioStation 1: OGG</name>
         <genre>Varios</genre>
         <description>Test Radio 1</description>
         <url>http://192.168.24.102:8000/</url>
       </metadata>
       <input>
         <param name="type">basic</param>
         <param name="file">/opt/icecast/latest/etc/playlist1.txt</param>
         <param name="random">1</param>
         <param name="once">0</param>
         <param name="restart-after-reread">1</param>
       </input>
       <instance>
         <hostname>192.168.24.102</hostname>
         <port>8000</port>
         <password>password</password>
         <mount>/emisora1</mount>
       </instance>
     </stream>
</ices>
Viendo el ficherho ices1.xml en detalle, tenemos: 
  • La sección GENERIC define el modo de ejecución de Ices y dónde colocar el PID. 
  • La sección LOGGING define todo lo referente a los logs. 
  • La sección STREAM define la estación de radio en sí misma con su nombre, URL, etc. 

Ahora necesitamos algo vital: ¡La música! No hacemos nada si no tenemos un playlist de la música que tenemos disponible en el sistema. Podemos crear una lista manualmente editando un fichero texto plano.
[root@icecastsrv01 ~]# cd /opt/icecast/latest/etc/
[root@icecastsrv01 etc]# vi playlist1.txt
/root/music/artist/album/track01.ogg
/root/music/artist/album/track02.ogg
O crear una lista en base a una búsqueda. Más rápido si se trata de mucha música.
[root@icecastsrv01 ~]# find /root/music/artist/album/ -name "*.ogg" > /opt/icecast/latest/etc/playlist1.txt
Finalmente iniciamos Ices para probar.
[root@icecastsrv01 ~]# /opt/icecast/latest/bin/ices /opt/icecast/latest/etc/ices1.xml
Veamos el log de Ices
[root@icecastsrv01 ~]# tailf /var/log/icecast/ices1.log
[2013-01-28  12:17:05] INFO signals/signal_usr1_handler Metadata update requested
[2013-01-28  12:17:05] INFO playlist-basic/playlist_basic_get_next_filename Loading playlist from file "/opt/icecast/latest/etc/playlist1.txt"
[2013-01-28  12:17:05] INFO playlist-builtin/playlist_read Currently playing "/root/music/artist/album/song2.ogg"
[2013-01-28  12:17:05] INFO stream/ices_instance_stream Connected to server: 192.168.24.102:8000/emisora1
Ahora podemos escuchar desde cualquier reproductor como VLC o Banshee nuestra estación con la URL http://192.168.24.102/emisora1. 

Es posible tener varias estaciones con en la configuración de Ices, colocando en la sección STREAM la configuración correspondiente a otra estación con su propio playlist.

Configurando Icegenerator 

Icegeneretor es un cliente de streaming en formato MP3. Este cliente también necesita de libshout, la cual fue instalada como prerequisito para el cliente Ices. Nos ahorraremos esos pasos aquí.
[root@icecastsrv01 ~]# cd /usr/src/icecast
[root@icecastsrv01 icecast]# wget http://netcologne.dl.sourceforge.net/project/icegenerator/icegenerator/0.5.5-pre2/icegenerator-0.5.5-pre2.tar.gz
[root@icecastsrv01 icecast]# tar xfz icegenerator-0.5.5-pre2.tar.gz
[root@icecastsrv01 icecast]# cd icegenerator-0.5.5-pre2
[root@icecastsrv01 icegenerator-0.5.5-pre2]# ./configure
[root@icecastsrv01 icegenerator-0.5.5-pre2]# make 
[root@icecastsrv01 icegenerator-0.5.5-pre2]# make install
Verificamos que se haya instalado correctamente.
[root@icecastsrv01 icegenerator-0.5.5-pre2]# ls -lah /usr/local/bin/ice*
-rwxr-xr-x 1 root root 55K 2013-01-28 12:41 /usr/local/bin/icegenerator*
Ahora procedemos a configurar nuestra estación de radio en MP3.
[root@icecastsrv01 icegenerator-0.5.5-pre2]# cd /usr/local/etc
[root@icecastsrv01 etc]# vi icegen1.cfg
IP=192.168.24.102
PORT=8000
SERVER=2
MOUNT=/emisora2
PASSWORD=password
FORMAT=1
MP3PATH=m3u:/usr/local/etc/playlist2.m3u
LOOP=1
SHUFFLE=1
NAME=RadioStation 2: MP3
DESCRIPTION=Test Radio
GENRE=Varios
URL=http://192.168.24.102:8000/
LOG=2
LOGPATH=/var/log/icecast/icegen1.log
BITRATE=48000
SOURCE=source
Este fichero es ligeramente diferente en cuanto a formato pero la idea sigue siendo la misma, parámetros y variables para el cliente Icegenerator: Dirección IP del servidor, puerto, protocolo http, punto de montaje, contraseña, ubicación del playlist, formato: 1 para MP3, 2 para OGG, repetición de la lista, modo aleatorio, descripción, género, URL, log, calidad del stream, etc. 

Ahora creamos el playlist para esta emisora, de forma manual.
[root@icecastsrv01 ~]# vi /usr/local/etc/playlist2.m3u
/root/music/artist/album/track01.mp3
/root/music/artist/album/track02.mp3
O por lotes si se trata de mucha música.
[root@icecastsrv01 ~]# find /music/artist/album/ -name "*.mp3" > /usr/local/etc/playlist2.m3u
Iniciamos Icegenerator para probar su funcionamiento
[root@icecastsrv01 ~]# export LD_LIBRARY_PATH=/opt/icecast/latest/lib:$LD_LIBRARY_PATH; /usr/local/bin/icegenerator -f /usr/local/etc/icegen1.cfg
[root@icecastsrv01 ~]# pgrep -fl icegen
31255 icegenerator -f /usr/local/etc/icegen1.cfg

[root@icecastsrv01 ~]# cat /var/log/icecast/icegen1.log
Mon Jan 28 13:44:38 2011: Connected to stream server
Mon Jan 28 13:44:38 2011: Now playing track02.mp3
Mon Jan 28 13:48:41 2011: Wait for all child process to terminate......
Al igual que en el caso de la emisora1, podemos accesar emisora2 desde cualquier reproductor que lo soporte o desde un navegador con la URL http://192.168.24.102:8000/emisora2. 



Por ahora no se dispone de un InitScript para iniciar Icecast y los clientes, por lo que crearemos un pequeño script de bash para al menos iniciarlos manualmente cuando encendamos el equipo.
[root@icecastsrv01 ~]# vi icecastsrv.sh
#!/bin/bash
/opt/icecast/latest/bin/icecast -c /opt/icecast/latest/etc/icecast.xml -b
/opt/icecast/latest/bin/ices /opt/icecast/latest/etc/ices1.xml
export LD_LIBRARY_PATH=/opt/icecast/latest/lib:$LD_LIBRARY_PATH; /usr/local/bin/icegenerator -f /usr/local/etc/icegen1.cfg
Y probamos inmediatamente nuestro script.
[root@icecastsrv01 ~]# ./icecastserver.sh 
Starting icecast2
Detaching from the console
Changed groupid to 200.
Changed userid to 200.



Artículos relacionados



Widget by Hoctro | Jack Book

13 comentarios:

  1. He seguido paso a paso todo este manual pero solo lo puedo escuchar yo, nadie mas de mi red lo puede escuchar no se que puede pasarme, ¿podrias ayudarme? No se que decir tampoco porque ices no arroja errores, el uico problema es que los demas equipos de la red no pueden escucharlo en http://miip:8000/emisora1

    ResponderEliminar
    Respuestas
    1. Revisa el firewall y selinux por si estan impidiendo conexiones externas.

      Eliminar
  2. HOla, gracias por este increible tuto, instale todo ok pero...
    tengu un problema, necesito transmitir en aacplus, uso sambroadcaster para el encoder, pero no puedo hacer que funcione el flash player...

    te agradeceria si me orientares sobre este tema...

    Saludos!

    ResponderEliminar
    Respuestas
    1. Hola Javier.

      Parece que has podido configurarlo bien pero el problema es del flash player.

      Eso podría ser algo simple de verificar probando con otro navegador y procurando, si es Chromium, que tenga todos sus codec internos instalados.

      En el caso de otros navegadores debes hacer lo mismo también, ya que en Linux muchas veces los navegadores no usan los codecs gstreamer del sistema, sino que procuran sus propios.

      Un saludo y gracias por seguir el blog...

      Eliminar
    2. Ah y en Fedora, por ej, con Chromium debes instalar este paquete: chromium-ffmpegsumo.i686, que es un media playback library.

      Eliminar
  3. Hola Claudio.

    Te comento que pude solucionar lo del flash player, por si le sirve a otra persona, el problema es la version de icecast, hay que seguir todos los pasos de este fantastico tuto pero.. a la hora des descargar icecast reemplazarlo por la version de icecastKH, este envia headers especiales flv a los flash players aacplus para que suene el audio.

    Solo una cosa... podrias darme algun comando para reiniciar y detener icecast y sus dos clientes de streaming??

    Gracias de antemano y un fantastico trabajo...

    ResponderEliminar
    Respuestas
    1. Hola Javier.

      Que bueno que investigaste y lo resolviste.

      Con respecto a reiniciar los servicios, como en esta guía se compiló el código fuente de icecast, este no crea los initscripts. Te recomiendo que hagas un script parecido al que hice para iniciarlos, solo que para detenerlos y usa el comando killal. Busca como se llaman los procesos con ps aux | grep "nombre-proceso", y en el script le pondrás killall nombre-proceso.

      Me parece que anda por ahí un initscript para icecast, yo no lo he probado. Pero tu eres bueno investigando, así que espero por tí para ver cómo se hace eso.

      Un abrazo.

      Eliminar
  4. Muy bueno el tuto, tengo una pregunta, es posible (lei por ahi que si es posible) que el servidor transmita audio automaticamente y solo se corte cuando se conecta un cliente Streaming y vuelva a retomar cuando este ultimo se desconecte?
    Gracias

    ResponderEliminar
  5. Saludos cordiales , he cofigurado el icecast2 y funciona muy bien con el sambrocaster,en windows, lo tengo alojado aqui http://www.utm.edu.ec/radio y lo publique en tunein aqui http://tunein.com/radio/UTMRadio-s206427/ en las PC funciona muy bien, Pero hace una semana no funciona en los smarphone, pues antes se entraba a la app de tunien y la sentonizaba , ahora sale la radio pero no conecta, (UTM Radio),he revisado los encoders del sambrocaster y la configuracion de icecast y es la misma no he cambiado nada... me puedes dar luces por donde revizar o que sera ?

    ResponderEliminar
  6. Buenas. He estado creando una aplicación para administrar un servidor con Icecast2 y EZStream a través de una aplicación web al estilo de CentovaCast pero un poco más amateur. Lo tengo casi funcionando y estoy en fase de depuración. Me gustaría ver si esto ha sido solo un hobby o puede interesarle a alguien más. Si quereis más información sobre el software mandadme un correo a info[arroba]ccradio.es. También busco información sobre foros "activos" sobre Icecast en español así que os agradecería cualquier información que pudieseis enviarme.

    Saludos.

    ResponderEliminar
  7. Muchas gracias! No sabes como me haz ayudado!

    ResponderEliminar
  8. Genio una consulta, en Broadcas Myself ya conectado donde en que sitio sale mi streaming? Desde ya gracias

    ResponderEliminar
  9. Hola, En centos tengo instalado Icecast 2.3.3-kh11
    ¿Sabés, cómo puedo actualizarlo a una versión más reciente?
    Muchas gracias.

    ResponderEliminar