Photo by Jacob Hodgson / Unsplash

Crea tu propia radio por internet con Raspberry y Icecast con Ices2 para reproducir tus listas de música por internet

Raspberry 23 de nov. de 2023

¿Sueñas con tener tu propia estación de radio? ¡Ese sueño puede estar mucho más cerca de lo que piensas!

En este artículo vamos a poner en marcha un canal de radio por internet gratuito desde tu Raspberry pi, al que podrás acceder desde cualquier parte del mundo mundial para así poder escuchar todas tus canciones, programas o podcasts favoritos.

Qué vamos a hacer

Vamos a configurar un servidor multimedia por internet llamado Icecast2. Icecast2 va a reproducir por internet lo que le proporcione un servicio de contenidos, para el que usaremos un programa llamado Ices2, al que le suministraremos nuestros archivos de audio.

Configuramos Icecast2

Lo primero que haremos es configurar Icecast2. En raspbian es un procedimiento sencillo, al ser una distribución Debian, basta con bajarse los paquetes del administrador de paquetes por defecto:

ardumaster@little-monkey:~ $ sudo apt update
ardumaster@little-monkey:~ $ sudo apt install icecast2
Recuerda siempre hacer "update" para refrescar las fuentes antes de instalar paquetes nuevos.

Una vez hecho esto, nos aparecerá un diálogo con algunas preguntas para empezar a configurar Icecast2:

Al instalar Icecast2 te saldrán unos diálogos para simplificar la configuración.

En nuestro caso, ejecutaremos Icecast2 en local, por lo que no tocaremos la configuración acerca del dominio. Recomiendo encarecidamente que hagas lo mismo, por seguridad, y que accedas a tu servidor a través de una VPN, así como a cualquier otro servicio que tengas en tu red local; de esta manera minimizas las vulnerabilidades a las que expones tu red personal al reducir el número de contactos directos con el exterior.

Recuerda que tenemos un artículo acerca de como configurar y poner en marcha tu propia VPN de forma sencilla con Wireguard:

Olvídate de anuncios estés donde estés con Pi-hole y WireGuard
Elimina anuncios en apps y internet en tu LAN y a distancia con WireGuard, Pi-Hole y Duck DNS
Aquí encontrarás instrucciones para crear tu propia VPN.

También puedes modificar la configuracón de Icecast2 editando el archivo de configuración directamente:

ardumaster@little-monkey:~ $ sudo nano /etc/icecast2/icecast.xml
ardumaster@little-monkey:~ $ sudo systemctl restart icecast2.service
Recuerda reiniciar el servicio para que se apliquen los cambios.

Una vez hayas configurado Icecast2, cambiando los usuarios y las contraseñas, podras visitar la página de Icecast2 en la siguiente dirección: IP_de_tu_raspberry:8000, a no ser que hayas modificado el puerto. En mi caso, este sería: 192.168.1.85:8000

¡Éxito, nuestro servidor Icecast2 está en marcha!

Solo falta comprobar que podemos acceder al área de administración haciendo clic en "Administration" e introduciendo nuestras credenciales, que acabamos de definir:

Iniciamos sesión con las credenciales que hemos indicado anteriormente

Perfecto, ahora solo queremos que Icecast2 se inicie automáticamente al reiniciar nuestra Raspberry, por lo que introcucimos el siguiente comando:

ardumaster@little-monkey:~ $ sudo systemctl enable icecast2
icecast2.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable icecast2
A partir de ahora, Icecast2 se iniciará con la Raspberry.

Añadimos los ficheros a emitir

Es hora de añadir los ficheros que queremos emitir. Si ya están en formato Vorbis, puedes avanzar hasta la creación de la carpeta en nuestra Raspberry, en caso contrario, necesitaras convertir tus archivos de audio previamente.

Conversión de archivos

Necesitamos que los archivos estén en formato .ogg, por lo que si tienes, por ejemplo mp3, primero deberás convertirlos. Por fortuna, es un proceso muy sencillo gracias a la existencia de herramientas de código abierto y gratuitas como Audacity, que recomiendo para esta tarea:

Audacity ® | Free, open source, cross-platform audio software for multi-track recording and editing.
Audacity is a free, easy-to-use, multi-track audio editor and recorder for Windows, Mac OS X, GNU/Linux and other operating systems. Edit, mix, and enhance your audio tracks with the power of Audacity. Download now.
Uno de los mejores editores de audio.. ¡y es gratuito!

Primero, descarga el programa e instálalo desde el enlace publicado arriba y ábrelo. Esto iniciará un proyecto nuevo.

Desde el explorador de archivos, selecciona y arrastra todos los archivos que quieras convertir  y arrástralos a la ventana de Audacity: deberían aparecer como pistas independientes:

Añadimos nuestro archivos a Audacity para convertirlos en masa a .ogg

Ahora solo hace falta hacer clic en Archivo>Exportar>Exportar múltiple:

Exportamos múltiple para acelerar el proceso.

Y seleccionar el formato de salida, que tiene que ser Ogg Vorbis para nuestra radio por internet:

¡Recuerda seleccionar Ogg vorbis como formato de salida!

Una vez finalizado el proceso de exportación, los archivos están listos para nuestra radio.

Creación de la lista de reproducción

Empezaremos creando una carpeta donde guardaremos los archivos multimedia:

ardumaster@little-monkey:~ $ mkdir /mnt/extra/radio/

En mi caso, este es /mnt/extra/radio, ya que he decidido utilizar un disco externo para ello. Hay muchas formas de pasar los archivos a esta carpeta, pero recomiendo montar un servidor Samba; para el cual tenemos un artículo que detalla cómo ponerlo en marcha:

Crea un disco en línea con Raspberry y Samba
Configura una unidad de red remota con samba y raspberry pi para acceder a tus archivos estés donde estés. Tutorial de crear NAS con Raspberry Pi.
Crea tu propio servidor Samba, es muy útil para infinidad de proyectos.

Ahora que tenemos las pistas de audio, necesitamos crear un documento de texto que detalle que archivos de audio queremos reproducir, y en que orden, a no ser que hayas configurado un orden aleatorio.

Para ello creamos un archivo de texto en esta misma carpeta y añadimos la ruta completa de los archivos que queremos reproducir:

ardumaster@little-monkey:~ $ cd /mnt/extra/radio/
ardumaster@little-monkey:/mnt/extra/radio $ nano playlist.txt

Por ejemplo:

/mnt/extra/radio/01 - Wrath of the Righteous Main Theme.ogg
/mnt/extra/radio/02 - The Myth Begins.ogg
/mnt/extra/radio/03 - Lords of Chaos.ogg
/mnt/extra/radio/04 - Kenabres in Flames.ogg
/mnt/extra/radio/05 - Crusaders_ March.ogg
/mnt/extra/radio/06 - Leper_s Smile.ogg
/mnt/extra/radio/07 - Devoured by Darkness.ogg
/mnt/extra/radio/08 - City to Reclaim.ogg
/mnt/extra/radio/09 - So Many Hopes to Burn.ogg
Contenido de /mnt/extra/radio/playlist.txt

Todo listo, solo nos falta alguien que le dé estos archivos a Icecast2.

Configuramos Ices2

Vamos a por la última parte de la ecuación, el programa que creará el stream de contenido: Ices2.

Empezamos instalando el paquete y las herramientas que necesita:

ardumaster@little-monkey:~ $ sudo apt install ices2
ardumaster@little-monkey:~ $ sudo apt install vorbis-tools

Ahora vamos a crear una carpeta con la configuración de Ices2, que copiaremos de sus ejemplos:

ardumaster@little-monkey:~ $ sudo mkdir /etc/ices2
ardumaster@little-monkey:~ $ sudo cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2/
ardumaster@little-monkey:~ $ sudo nano /etc/ices2/ices-playlist.xml
Copiamos la configuración de un ejemplo y la editamos

Ahora lo que toca es ir editando la configuración según nuestras necesidades. A continuación propongo unas modificaciones mínimas:

Primero buscamos la etiqueta “<stream>” y modificamos los campos:

  • <name> Con el nombre de nuestra emisora.
  • <genre> Con el género de música o la temática de los podcasts o programas que queremos emitir.
  • <description> Con una descripción más detallada de la emisora.
    <stream>
        <!-- metadata used for stream listing (not currently used) -->
        <metadata>
            <name>Radio Ardumaster</name>
            <genre>Musica de Arduino</genre>
            <description>Bienvenidos a la radio Ardumaster!</description>
        </metadata>
…
Resultado del bloque de configuración <stream> modificado.

Buscamos la etiqueta “<input>” e introducimos los datos del archivo que indica las pistas que queremos reproducir, que acabamos de crear en la sección anterior:

  • <param name=”file”> Ponemos la ruta del archivo que hemos creado.
        <input>
            <module>playlist</module>
            <param name="type">basic</param>
            <param name="file">/mnt/extra/radio/playlist.txt</param>
…
Resultado del bloque de configuración <input> modificado.

Por último, buscamos la etiqueta “<instance>” y cambiamos los siguientes parámetros para indicar el punto de arranque de esta emisión:

  • <mount> Algo que te parezca adecuado, en mi caso: /radioArdumaster.
        <instance>
            <!-- Server details:
                You define hostname and port for the server here, along with
                the source password and mountpoint.  -->
            <hostname>localhost</hostname>
            <port>8000</port>
            <password>27059342</password>
            <mount>/radioArdumaster</mount>
...
Resultado del bloque de configuración <instance> modificado.

A continuación adjunto el archive entero, sé que puede ser difícil visualizarlo a cachitos:

<?xml version="1.0"?>
<ices>
    <!-- run in background -->
    <background>0</background>
    <!-- where logs, etc go. -->
    <logpath>/var/log/ices</logpath>
    <logfile>ices.log</logfile>
    <!-- 1=error,2=warn,3=info,4=debug -->
    <loglevel>4</loglevel>
    <!-- set this to 1 to log to the console instead of to the file above -->
    <consolelog>0</consolelog>

    <!-- optional filename to write process id to -->
    <!-- <pidfile>/home/ices/ices.pid</pidfile> -->

    <stream>
        <!-- metadata used for stream listing (not currently used) -->
        <metadata>
            <name>Radio Ardumaster</name>
            <genre>Musica de Arduino</genre>
            <description>Bienvenidos a la radio Ardumaster!</description>
        </metadata>

        <!-- input module

            The module used here is the playlist module - it has
            'submodules' for different types of playlist. There are
            two currently implemented, 'basic', which is a simple
            file-based playlist, and 'script' which invokes a command
            to returns a filename to start playing. -->

        <input>
            <module>playlist</module>
            <param name="type">basic</param>
            <param name="file">/mnt/extra/radio/playlist.txt</param>
            <!-- random play -->
            <param name="random">0</param>
            <!-- if the playlist get updated that start at the beginning -->
            <param name="restart-after-reread">0</param>
            <!-- if set to 1 , plays once through, then exits. -->
            <param name="once">0</param>
        </input>

                <!-- Stream instance
            You may have one or more instances here. This allows you to
            send the same input data to one or more servers (or to different
            mountpoints on the same server). Each of them can have different
            parameters. This is primarily useful for a) relaying to multiple
            independent servers, and b) encoding/reencoding to multiple
            bitrates.
            If one instance fails (for example, the associated server goes
            down, etc), the others will continue to function correctly.
            This example defines two instances as two mountpoints on the
            same server.  -->
        <instance>
            <!-- Server details:
                You define hostname and port for the server here, along with
                the source password and mountpoint.  -->
            <hostname>localhost</hostname>
            <port>8000</port>
            <password>27059342</password>
            <mount>/radioArdumaster</mount>

            <!-- Reconnect parameters:
                When something goes wrong (e.g. the server crashes, or the
                network drops) and ices disconnects from the server, these
                control how often it tries to reconnect, and how many times
                it tries to reconnect. Delay is in seconds.
                If you set reconnectattempts to -1, it will continue
                indefinately. Suggest setting reconnectdelay to a large value
                if you do this.
            -->
            <reconnectdelay>2</reconnectdelay>
            <reconnectattempts>5</reconnectattempts>

            <!-- maxqueuelength:
                This describes how long the internal data queues may be. This
                basically lets you control how much data gets buffered before
                ices decides it can't send to the server fast enough, and
                either shuts down or flushes the queue (dropping the data)
                and continues.
                For advanced users only.
            -->
            <maxqueuelength>80</maxqueuelength>

            <!-- Live encoding/reencoding:
                Currrently, the parameters given here for encoding MUST
                match the input data for channels and sample rate. That
                restriction will be relaxed in the future.
                Remove this section if you don't want your files getting reencoded.
            -->
            <encode>
                <nominal-bitrate>64000</nominal-bitrate> <!-- bps. e.g. 64000 for 64 kbps -->
                <samplerate>44100</samplerate>
                <channels>2</channels>
            </encode>
        </instance>

        </stream>
</ices>
El archivo entero, por si surgen dudas.

Te habrás fijado en que Ices2 tiene un archivo de registros por defecto: /var/log/ices; pero no tiene permisos para escribir a él, por lo que tenemos que otorgárselos:

ardumaster@little-monkey:/mnt/extra/radio $ sudo chmod 777 /var/log/ices

Una vez tengamos todo configurado, solo basta con iniciar Ices2 con el siguiente comando:

ardumaster@little-monkey:~ $ ices2 /etc/ices2/ices-playlist.xml &

¡A disfrutar de la radio!

Comprobamos que todo funciona

Es tan sencillo como visitar nuestra Ip, con el puerto adecuado y el punto de montaje, en nuestro caso 192.168.85:8000/radioArdumaster, para poder escuchar un stream de nuestros archivos favoritos.

Si quisiéramos escuchar este stream desde fuera de nuestra red local, tan solo sería necesario conectarnos previamente a nuestra VPN.

Conclusiones

Ahora ya tienes todo lo necesario para crear una lista de reproducción en línea y escucharla desde cualquier sitio gracias a tu VPN (o directamente desde tu propio dominio, si así lo has configurado).

En el futuro, exploraremos como hacerlo para poder emitir en vivo y como publicar podcasts, pero por ahora, ¿qué piensas emitir? ¿Lo compartirás con tus amigos? ¿O será une emisión privada? En todo caso, ¡estaría muy agradecida si decidieras contármelo en los comentarios!

Etiquetas