Duisburger Linux User Group - http://www.dulug.de
Stammtisch 03.08.2007: Audiostreaming mit Icecast
Keine Garantie auf Vollständigkeit und/oder Funktionalität!!!
Autor: M. Franke <mfranke@dulug.de>

Diese Anleitung bezieht auch nur auf das Streamen von Ogg-Vorbis-Dateien! Wer MP3's streamen will kann den hier vorgestellten Icecast übernehmen, sollte aber anstelle von ices z.B. darkice nehmen.

Mit Icecast lassen sich Audiodateien über ein Netzwerk streamen. Das kann sowohl ein lokales Netzwerk als auch das Internet sein. Somit ist es z.B. möglich von zu Hause aus seinen Freunden einen Internet- Radio-Sender zur Verfügung zu stellen - vorausgesetzt man hat die entsprechende Bandbreite. Denn je mehr Freunde zuhören um so mehr wird auch die Bandbreite des Netzwerkes beansprucht!
Um einen Internet-Radio-Sender ans laufen zu bekommen braucht man einen Stream-Server und einen Stream Client. Server und Client werden im folgenden vorgestellt.

Stream-Server: icecast

Um Icecast ans laufen zu bekommen muss man sich natürlich erst einmal Icecast installieren. Wer kein vorgefertigtes Distributions-Paket hat kann sich die Quellen von http://www.icecast.org/download.php herunterladen und übersetzen. Bitte die zugehörige Bibliothek libshout nicht vergessen:

$ tar xfz libshout-2.2.2.tar.gz
$ cd libshout-2.2.2/
$ ./configure
$ make
$ make install

Wenn alles geklappt hat dann sollte man unter /usr/local/lib/ die Bibliothek und unter /usr/local/include/ die zugehörigen Header-Dateien wiederfinden:

$ ls /usr/local/lib/libshout*
/usr/lib/libshout.a /usr/lib/libshout.la* /usr/lib/libshout.so@ /usr/lib/libshout.so.3@ /usr/lib/libshout.so.3.2.0*
$ ls /usr/local/include/shout/
/usr/include/shout/shout.h

Danach noch den Icecast selbst übersetzen:

$ tar xfz icecast-2.3.1.tar.gz
$ cd icecast-2.3.1
$ ./configure
$ make
$ make install

Danach hat man unter /usr/local/bin/ den Server liegen:

$ ls /usr/local/bin/ice*
icecast

Bevor man aber mit Icecast seine Audiodateien streamen kann muss man Icecast noch konfigurieren. Dazu legt man unter /usr/local/etc/icecast/ die Konfiguration icecast.xml an:

$ mkdir -p /usr/local/etc/icecast/
$ lieblingseditor /usr/local/etc/icecast/icecast.xml

(lieblingseditor ist natürlich durch z.B. vi, kwrite etc zu ersetzen)

<icecast>
<limits>
<clients>10</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>
<authentication>
<source-password>password1</source-password>
<admin-user>radioadmin</admin-user>
<admin-password>password2</admin-password>
</authentication>
<hostname>localhost</hostname>
<listen-socket>
<port>8000</port>
</listen-socket>
<fileserve>1</fileserve>
<paths>
<basedir>/usr/local/share/icecast</basedir>
<webroot>/usr/local/share/icecast/web</webroot>
<adminroot>/usr/local/share/icecast/admin</adminroot>
<logdir>/var/log/icecast</logdir>
<pidfile>/var/run/icecast/icecast.pid</pidfile>
<alias source="/" dest="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<playlistlog>playlist.log</playlistlog>
<loglevel>1</loglevel>
<logsize>10000</logsize>
<logarchive>1</logarchive>
</logging>
<security>
<chroot>0</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>

Anbei ein paar Erklärungen zur icecast.xml:

<limits>
Unter limits werden allgemeine Verhaltensweisen konfiguriert, z.B. wieviele Zuhörer maximal zugelassen sind, Wieviele Sourcen (dazu später mehr) es geben darf etc.

<authentication>
In dem Bereich werden ein paar Passwörter festgelgt.
source-password: bestimmt das Passwort für die Sourcen
admin-user: der Admin-User für das Webfrontend
admin-password: das Passwort für den Admin

<hostname>
Der Name des Servers.

</listen-socket>
Der Port auf dem man sich verbinden kann, in dem Fall 8000.

<paths>
Ein paar Pfade die Icecast braucht um zu arbeiten. basedir, webroot und adminroot sollten schon beim überstzen angelegt worden sein. Die Pfade müssen ggf. eurer Installation entsprechend angepasst werden. logdir und pidfile müssen ggf. noch erstellt werden:

$ mkdir -p /var/log/icecast /var/run/icecast

<security>
Zuletzt noch die Sicherheit. Der Benutzer und die Gruppe mit der Icecast laufen soll. Dazu entweder die Distributionstools benutzen um einen Benutzer für Icecast anzlegen oder von Hand die Dateien /etc/passwd und /etc/group bearbeiten:

$ lieblingseditor /etc/passwd
...
icecast:x:500:200:User for Icecast::/bin/false
$ lieblingseditor /etc/group
...
icecast:x:200:

Beim anlegen des Benutzers bitte darauf achten das die User-ID (500) und die Gruppen-ID (200) noch nicht vergeben ist bzw. falls schon vergeben eine andere ID zu wählen! Da wir das Log-Verzeichnis als User root angelegt haben müssen wir noch dem Benutzer icecast das Recht geben dort hineinzuschreibn:

$ chown icecast:icecast /var/log/icecast

Das war es schon. Jetzt kann man den Icecast starten und prüfen ob er mit dem Benutzer icecast läuft:

$ /usr/local/bin/icecast -c /usr/local/etc/icecast/icecast.xml -b
Starting icecast2
Detaching from the console
Changed groupid to 200.
Changed userid to 500.
$ ps -ef | grep icecast
icecast 19925 1 0 12:48 pts/3 00:00:00 /usr/local/bin/icecast -c /usr/local/etc/icecast/icecast.xml -b

Die -c Option gibt den Ort der Konfigurationsdatei an und die Option -b verschiebt den Icecast in den Hintergrund. Jetzt kann man auch schon einen Webbrowser starten und sich mit dem Rechner auf den der Icecast läuft über die Adresse http://icecast-server:8000/ verbinden. Da wir aber noch keine Streams haben sehen wir noch nicht viel.

Stream-Client: ices

Zum Streamen braucht man nämlich noch ein weiteres Programm - ices. ices bekommt man auch unter http://www.icecast.org/download.php. Und genauso wie bereit icecast muss ices erst übersetzt werden (wenn man kein vorkompiliertes Paket seiner Distribution findet):

$ tar xfj ices-2.0.1.tar.bz2
$ cd ices-2.0.1
$ ./configure
$ make
$ make install

Danach sollte man ein weiteres Programm unter /usr/local/bin/ finden:

$ ls /usr/local/bin/ice*
icecast ices

Wenn die Installation abgeschlossen ist kann man als normaler User weitermachen da ices ohne root-Rechte lauft! Zuerst erstellen wir eine Konfigurationsdatei für unseren 1. Stream den wir anbieten wollen unter /home/user/ices-rock.xml (user ist natürlich durch einen gültigen Benutzernamen zu ersetzen). Und da wir ordentliche Rock-Musik anbieten wollen ergänzen wir den Namen der Konfigurationdatei um 'rock':

<ices>
<background>1</background>
<logpath>/home/user/</logpath>
<logfile>ices-rock.log</logfile>
<logsize>2048</logsize>
<loglevel>3</loglevel>
<consolelog>0</consolelog>
<pidfile>/var/run/icecast/ices.pid</pidfile>
<stream>
<metadata>
<name>Testradio: Rock</name>
<genre>Rock</genre>
<description>Local Test Radio</description>
<url>http://localhost:8000/</url>
</metadata>
<input>
<param name="type">basic</param>
<param name="file">/home/user/playlist-rock.txt</param>
<param name="random">1</param>
<param name="once">0</param>
<param name="restart-after-reread">1</param>
</input>
<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>password1</password>
<mount>/rock.ogg</mount>
</instance>
</stream>
</ices>

<ices>
Zu Beginn stehen wieder ein paar allgemeine Sachen z.B. wohin geloggt werden soll etc. Bitte wieder daran denken die Pfade anzupassen falls nötig!

<metadata>
Hier können ein paar Information zu dem Stream hinterlegt werden, welchem Genre der Stream zuzuordnen ist usw.

<input>
Wichtig in input ist der Parameter file. In der Playlist stehen alle Dateien die wir streamen wollen.

<instance>
Unter instance müssen wir das Passwort eingeben das wir in der icecast.xml vergeben haben, also password1

Und zuletzt erstellen wir die Playlist. Dazu benutzen wir das find-Kommando um unsere Ogg-Dateien zu finden:

$ find /path/to/music/ -name "*.ogg" > /home/user/playlist-rock.txt

Danach sind wir komplett und wir müssen nur noch den ices starten:

$ /usr/local/bin/ices /home/user/ices-rock.xml

Wenn man jetzt noch mal auf das Webfrontend schaut, sieht man den neuen Stream. Wenn man jetzt einen Player wie mplayer, ogg123, Amarok oä. startet und ihn mit der URL füttert die in dem Mountpoint angegeben wird kann man seinen Stream anhören:

$ ogg123 http://localhost:8000/rock.ogg
Audio Device: Advanced Linux Sound Architecture (ALSA) output
Playing: http://localhost:8000/rock.ogg
Ogg Vorbis stream: 2 channel, 44100 Hz
Album: Deadly Sting
Artist: Scorpions
Description:
Genre: Rock
Title: Dynamite
Time: 01:08.86 (230.4 kbps) Input Buffer 56.3% Output Buffer 96.9%

Für jeden weiteren Stream kann man die Datei ices-rock kopieren, anpassen und anschliessend ein neue Playlist erstellen. Danach noch einen weiteren ices mit der neuen Konfigurationsdatei starten und schon hat man einen weiteren Stream.