music streaming

22 April 2008

Musik streamen unter Linux

Ziel war es einen Musikstream selber mittels Linux zu realisieren da ich musik in der Wohnung verteilen wollte und keine Kabel verlegen. Wlan machts möglich jetzt müssen nur noch clients her die das können. So langsam gibt es halbwegs akzeptable und bezahlbare Streaming-Clients bzw. Wlan-Radios. Das Problem ist nicht alle können per SMB auf Netzwerk-Laufwerke zugreifen auch Ogg-Files oder Flac-Files machen oft probleme. Ogg-Streams sind da schon etwas verbreiteter, Mp3-Streams so wieso. Die Lösung liegt also auf der Hand wir setzten einen kleinen Server auf der sich per tcp-ip oder Webinterface steuern lässt. Unter Linux gibt es hierfür schon alle Komponenten (Die UPnP lösungen empfand ich als holprig deswegen die Lösung als “Inernetradio”).

Der Mucke-Server:
Hier kommt der MPD zum Einsatz, er ist schlank und lässt sich der TCP-IP ansteuern kann ogg stream ausgeben und schluckt fast alles. Es gibt auch diverse Clients von Komandozeile bis php

Die Steuerung :
Es gibt hier viele Varianten sitzt man direkt am server verwende ich gmpc(GnomeGui) und mpc (Komandozeile) und Pitchfok (die seite ist leider down aber hier noch ein link zum download. Für Alternativen mal hier nachsehen. ) der Mit hilfe eines Apachen von diversen Webbrowsern erreichbar ist

Die Verteilung:
Hier werden eventuell 2 Komponenten nötig zum einen Icecast der den OggStream direkt raushaut wird ein Mp3Strem benötigt kommt noch der Streamtranscoder zum einsatz der den Oggstream ausliest, konvertiert und wieder an Icecast zurück gibt. Letztere variante benötigt aber einiges an rechenleistung.

So simpel siehts aus. Jetzt zur Installation und Konfiguration:

mpd, mpc und gmpc können unter fedora problemlos per yum installiert werden, sofern auch rpmforge als repo verwendet wird. Icecast empfielt es sich aus den scourcen zu übersetzten. Die fertigen rpms haben bei mir in einem von drei fällen probleme gemacht. Wichtig ist acuh mpd

    nach

nach icecast zu starten. Ich habe den mpd als normalen user laufen, da sich meine musikfiles im homeverzeichnis befinden.
also kurz:

yum install httpd httpd-manual httpd-tools gmpc mpc mpd mysql mysql-libs mysql-server php php-common php-mysql
mpd konfigurieren:

/etc/mpd.conf

## REQUIRED PATHS ##
music_directory     "/home/user/music/"
playlist_directory   "/home/user/music/playlists"
db_file       "/home/user/music/mpd.db"
log_file      "/home/user/music/mpd.log"
error_file    "/home/user/music//mpd.error"
#
## OPTIONAL PATHS ##
state_file   "/home/pl/music//mpdstate"
#
## DAEMON OPTIONS ##
user "user"
# "default", "secure", or "verbose".
#log_level "default"
 
## AUDIO OUTPUT ###
audio_output {
type   "pulse"
name   "Pulse"
server "localhost"
# sinnk "alsa_output.spdif_0"
}
#Icecast
audio_output {
type              "shout"
name            "My Shout Stream"
host              "localhost"
port               "8000"
mount           "/party.ogg"
password      "hackme"
quality          "5.0"
#bitrate         "128"
format          "44100:16:2"
# user          "source" # optional
# description "My Stream Description" # optional
# genre         "jazz"   # optional
# public         "no"     # optional
}
## CHARACTER ENCODINGS ##
filesystem_charset "UTF-8"
id3v1_encoding      "UTF-8"

icecast:

Die Scourcen runterladen und der Linux typische dreisatz:

./configure
make
su -c “make install”

Bei der Konfiguration (/usr/local/etc/icecast.xml) sollten im großen ganze die Default-Einstellungen reichen. Ich habe das logverzeichnis angepasst!.

<limits>
        <clients>100</clients>
        <sources>2</sources>
        <threadpool>5</threadpool>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>30</source-timeout>
        <burst-on-connect>1</burst-on-connect>
        <burst-size>65535</burst-size>
    </limits>
    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>hackme</source-password>
        <relay-password>hackme</relay-password>
        <admin-user>admin</admin-user>
        <admin-password>hackme</admin-password>
    </authentication>
    <hostname>localhost</hostname>
    <listen-socket>
        <port>8000</port>
    </listen-socket>
    <paths>
        <basedir>/usr/local/share/icecast</basedir>
        <logdir>/var/log/icecast</logdir> 
        <!-- Achtung hier habe ich was gändert-->
        <webroot>/usr/local/share/icecast/web</webroot>
        <adminroot>/usr/local/share/icecast/admin</adminroot>
    <logging>
        <accesslog>ice-access.log</accesslog>
        <errorlog>ice-error.log</errorlog>
      	<loglevel>4</loglevel> <!-- 4Debug 3Info 2Warn  1Error -->
      	<logsize>10000</logsize> <!-- Max size of a logfile -->
    </logging>

Pitchfork

Pitchfork runterladen und z.b. nach /var/www/pitchfork entpacken

anschließend die datei /etc/httpd/conf.d/pitchfork.conf
mit folgendem inhalt anlegen:

Alias /pitchfork /var/www/pitchfork
 
DirectoryIndex index.php
Options -Indexes
AllowOverride all
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc off
php_flag magic_quotes_runtime off
php_flag display_errors off
php_flag log_errors on
# switch comment marks on the two items to disable access logging
# completely for pitchfork. See INSTALL
SetEnvIf Request_URI "player/command.php" pitchforknolog
#SetEnv pitchforknolog

Dann noch kurz als root:

mkdir var/log/icecast/
touch /var/log/icecast/ice-error.log
touch /var/log/icecast/ice-access.log
chmod 777 -R /usr/local/var/log/icecast/

ich hab mir dann ein kleines Script geschieben das sicherstellt, daß alles in der passenden Reihenfolge gestartet wird:

stream.sh

#/bin/bash
service mpd stop
icecast -c /usr/local/etc/icecast.xml
service mpdstart
service httpd restart

have fun