Elke zichzelf respecterend radio station heeft tegenwoordig ook een stream. De meesten van ons hebben echter zelf ook een (serieus) stapeltje CD’s liggen of je hebt tracks legaal digitaal gedownload. Zou het nou niet mogelijk zijn om zelf een Internet Radio station te maken. Dat moet zeker kunnen, en we doen het ook nog met open source software.

In dit artikel gaan we uit van mp3-bestanden. Zorg er voor dat alle gebruikers op je systeem de mp3-bestanden kunnen lezen.

Een streamserver is het hart van je systeem, deze server krijgt “input” van een “source client”. De streamserver geeft je een stream url, zodat je kunt luisteren naar de “input”.

Wat gaan we allemaal doen? We starten met de streamserver. Hiervoor nemen we Icecast. Naast de streaming server Icecast hebben we ook nog een “source client” nodig. Hiervoor gebruiken we IceS. Deze Ices is er in twee smaken; Ices 2 die een source client is voor het streamen van het Ogg Vorbis formaat; en er is Ices 0 voor het streamen van het mp3 formaat.

Ices 2 is volledig gesupport, Ices 0 daarentegen wordt niet meer onderhouden, maar omdat het mp3-formaat goed vastgelegd is wordt dat nog prima gesupport.

Icecast

Kruip achter je toetsenbord en gebruik je favoriete package manager om Icecast te installeren. Nadat ze geïnstalleerd is is het tijd voor het configuratie werk. Icecast heeft haar configuratie bestand in /etc/icecast.xml. Dit bestand is goed gedocumenteerd en de meeste waarden die vermeld staan zijn prima. Je moet echter wel een paar aanpassingen doen. In de sectie <limits> wordt gesproken over <clients>. Dit is het totaalaantal gelijktijdige “luisteraars”. Ook wordt gesproken over <sources>. Dit zijn het aantal bronnen, of populair gezegd, het aantal Internet radiostations waarmee je gaat uitzenden. Bij de keys in het blok <authentication> is het natuurlijk zaak om de wachtwoorden aan te passen.

Voor <hostname> kun je een IP-adres gebruiken of een naam (b.v. radio.homeserver.nl) die in je netwerk vertaald kan worden naar een IP-adres. Via <port> geef je aan via welke poort de stream(s) naar buiten zenden.

We moeten nog wel een mountpoint definiëren, voeg de regels toe zoals aangegeven in Listing 1. Als mountnaam kies je een handige naam zonder whitespace karakters. Bij <limits> heb je al aangegeven wat het totaalaantal gelijktijdige luisteraars mag zijn, hier geven we aan dat het aantal gelijktijdige luisteraars naar deze stream 10 is. Verander dit naar eigen inzicht.

LISTING 1

<mount>

  <mount-name>Arjan</mount-name>
  <max-listeners>10</max-listeners>

 

</mount>

Een makkelijke valkuil is ook nog <pidfile>. Icecast heeft, zoals alle moderne tools, een systemd servicebestand (/usr/lib/systemd/system/icecast.service). In dit bestand staat ook een PIDFile gedefinieerd. Zorg ervoor dat <pidfile> en PIDFile hetzelfde gedefinieerd zijn. In het package uit de openSUSE Leap 15 repository zijn ze netjes gelijk, maar controleer dit als je een andere distributie gebruikt.

Start Icecast nu om te kijken of alles werkt: systemctl start icecast. Mochten er problemen voordoen dan betreft het meestal een typo in het configuratie bestand.

Ices

We moeten Icecast nog streams geven die zij moet uitzenden, dit doen we met Ices. Zoals al besproken, er zijn twee smaken. We moeten Ices 0 hebben. Deze Ices zit in nagenoeg geen enkele repository, dus we moeten de sources downloaden van http://icecast.org/ices. Download de tarfile ices-0.4.tar.gz en pak haar uit.

We gaan nu Ices bouwen vanaf source. Ga in de ice-0.4 map staan (hier staat ook het bestand configure). Voer uit ./configure. Dit commando gaat uitzoeken wat zij aan tools, libraries etc allemaal mist. Als ze alles heeft, genereert ze een makefile die je gebruikt om de exectable te maken. De eerste hindernis is configure tevredenstellen. Om je een quickstart te geven; zorg ervoor dat er tenminste het volgende geïnstalleerd is: gcc, libshout-devel, libmp3lame-devel, libxml2-devel en libfaad-devel.

Voordat we echt gaan compileren moeten we nog een vervelende eigenschap van Ices gladstrijken. We gaan Ices straks als een daemon gebruiken. Onder de motorkap start de Ices executable een deamon op en ruimt vervolgens haar eigen troep op. Als exit code geeft Ices dan de waarde 1. Standaard geven alle exit codes ongelijk 0 aan dat er wat fout is gegaan. Echter in dit geval is alles goed gegaan. Even glad strijken. Open je favoriete editor met het bestand ices-0.4/src/setup.c. Spring naar regel 136 en verander daar exit(1) in exit(0).

Configure tevreden, dan make all. Als make all klaar is heb je de executable ices-0.4/src/ices.  Plaats deze executable in een (standaard) bin map. Welke bin map je kiest (of maak een nieuwe bin map aan speciaal voor al je eigen executables) doet niet zoveel ter zake. Zorg wel dat de executable uitvoerbaar is.

Ices heeft ook nog een configuratie bestand en input bestand nodig. Een voor de hand liggende plek is /etc/ices met daaronder voor elke stream die ices moet mounten op een mountpunt in Icecast een eigen submap. In dit voorbeeld /etc/ices/Arjan. Plaats in deze map een tekstbestand (Arjan.txt) met daarin per regel het volle pad naar een mp3-bestand.Dit tekstbestand bevat de playlist die door deze stream gebruikt zal gaan worden. De volgorde doet niet ter zake aangezien we straks Ices gaan vertellen dat zij een willekeurige volgorde moet aan houden. Probeer wel een “groot” aantal mp3-bestanden in de lijst op te nemen. Bij slechts een klein aantal bestanden wordt het wel hele saaie Radio.

Vervolgens maak je een xml bestand aan (Arjan.xml) en plaatst deze ook in /etc/ices/Arjan. De inhoud van dit bestand is weergegeven in Listing 2. Vetgedrukte passages verdienen je aandacht.

LISTING 2

<?xml version=”1.0″?>
<ices:Configuration xmlns:ices=”http://www.icecast.org/projects/ices”>
 <Playlist>
   <!– This is the filename used as a playlist when using the builtin playlist handler. –>
   <File>/etc/ices/Arjan/Arjan.txt</File>  
   <!– Set this to 0 if you don’t want to randomize your playlist, and to 1 if you do. –>
   <Randomize>1</Randomize>
   <!– One of builtin, perl, or python. –>
   <Type>builtin</Type>
   <!– Module name to pass to the playlist handler if using  perl or python. If you use the builtin playlist handler then this is ignored –>
   <Module>ices</Module>
   <!– Set this to the number of seconds to crossfade between tracks. Leave out or set to zero to disable crossfading (the default).

   <Crossfade>5</Crossfade>

     –>
 </Playlist>

 <Execution>
   <!– Set this to 1 if you want ices to launch in the background as a daemon –>
   <Background>1</Background>
   <!– Set this to 1 if you want to see more verhttps://sourceforge.net/projects/mediatomb/bose output from ices –>
   <Verbose>1</Verbose>
   <!– This directory specifies where ices should put the logfile, cue file and pid file (if daemonizing). –>
   <BaseDirectory>/var/log/ices/Arjan</BaseDirectory>
 </Execution>

 <Stream>
   <Server>
     <!– Hostname or ip of the icecast server you want to connect to –>
     <Hostname>localhost</Hostname>
     <!– Port of the same –>
     <Port>8000</Port>
     <!– Encoder password on the icecast server –>
     <Password>hackme</Password>
     <!– Header protocol to use when communicating with the server.
          Shoutcast servers need “icy”, icecast 1.x needs “xaudiocast”, and
          icecast 2.x needs “http”. –>
     <Protocol>http</Protocol>
   </Server>

   <!– The name of the mountpoint on the icecast server –>
   <Mountpoint>Arjan</Mountpoint>
   <!– The name of the dumpfile on the server for your stream. DO NOT set
        this unless you know what you’re doing.
   <Dumpfile>ices.dump</Dumpfile>
   –>

   <!– The name of you stream, not the name of the song! –>
   <Name>Arjan</Name>
   <!– Genre of your stream, be it rock or pop or whatever –>
   <Genre>Pop</Genre>
   <!– Longer description of your stream –>
   <Description>Arjan’s Choice</Description>
   <!– URL to a page describing your stream –>
   <URL>http://radio.homeserver.nl:8000/Arjan</URL>
   <!– 0 if you don’t want the icecast server to publish your stream on
        the yp server, 1 if you do –>
   <Public>0</Public>

   <!– Stream bitrate, used to specify bitrate if reencoding, otherwise
        just used for display on YP and on the server. Try to keep it
        accurate –>
   <Bitrate>128</Bitrate>
   <!– If this is set to 1, and ices is compiled with liblame support,
        ices will reencode the stream on the fly to the stream bitrate. –>
   <Reencode>0</Reencode>
   <!– Number of channels to reencode to, 1 for mono or 2 for stereo –>
   <!– Sampe rate to reencode to in Hz. Leave out for LAME’s best choice
   <Samplerate>44100</Samplerate>
   –>
   <Channels>2</Channels>
 </Stream>
</ices:Configuration>

In het xml bestand is ook aangeven waar de log bestanden moeten komen. Zorg ervoor dat de geselecteerde map bestaat (/var/log/ices/Arjan) en schrijfbaar is.

Ices weet niets van systemd, dus moeten we zelf nog een systemd servicebestand maken voor de source stream die we met Ices gaan mounten op het mountpunt in Icecast. Zie Listing 3. Sla dit bestand op als /etc/systemd/system/ices-Arjan.service.

LISTING 3

#
# Copyright (c) 2013 Pascal Bleser <pascal.bleser@opensuse.org>
# Authors:
# * Pascal Bleser
# * http://pyn00b.blogspot.be/2012/11/life-with-systemd-part-2.html
# * Werner Fink for the postfix.service file
# * Arjan ten Hoopen for modifications for ices
#
# Description:
#
#  Used to start the Ices server for a given stream.
#

[Unit]
Description=Ices Server for Arjan
Requires=icecast.service
After=icecast.service

[Service]
ExecStart=/tenhoopen/bin/ices -B -c /etc/ices/Arjan/Arjan.xml
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Type=forking
PIDFile=/var/log/ices/Arjan/ices.pid

[Install]
WantedBy=multi-user.target

Om alle services te starten, en dusdanig dat ze bij een reboot automatisch opstarten, moeten we nog een aantal systemctl commando’s uitvoeren, zie Listing 4.

Listing 4

systemctl daemon-reload

systemctl start icecast ices-Arjan

systemctl enable icecast ices-Arjan

Ga nu met je browser naar http://localhost:8000. En zie daar, de Icecast2 Status pagina. Dit is een overzichts-pagina en spreekt voor zichzelf. Je ziet hier ook de stream url-s voor m3u als ook xspf. Deze urls gebruik je om een stream op te slaan in een client (bijvoorbeeld VLC op je mobiel).

Mocht je het jezelf wat makkelijker willen maken dan kun je ook kiezen om een UPnP Media Server te gebruiken. Deze server moet wel streams ondersteunen. Een goede kandidaat hiervoor is Mediatomb.

Je hebt nu gezien hoe je een Internet Radio Station opzet. Bedenk dat je nog maar 1 stream hebt. Het moet nu echter eenvoudig zijn om zelf meerdere streams te maken. In de praktijk blijkt dat icecast en (meerdere) ices sources weinig van je systeem vragen. Je hoeft dus niet te terughoudend te zijn met het aanmaken van extra sources.

LINKS:

Icecast: http://icecast.org/

Ices: http://icecast.org/ices/

Mediatomb: https://sourceforge.net/projects/mediatomb/