Mediaserver med icecast2 och mpd
Icecast är en server för strömmande media som förlitar sig på "source clients" som levererar data till icecast. Klienten är typiskt placerad där ljudkällan genereras och icecast oftast där det finns gott om bandbredd. Icecast kan användas för att skapa en webbradio, privat jukebox och många saker där i mellan.
Om ett ljudprogram i realtid ska konvertera en ljudström så kan det vara en riktig CPU hogger, mpd drar runt 18% när den spelar upp något, mer om det här. Icecast2 gör däremot väldigt lite avtryck på processorbelastningen.
Här är icecast2 officiella hemsida. Själv tyckte jag att deras dokumentation var mycket bristfällig och det tog ett bra tag innan jag förstod var och hur det skulle konfigureras för att det skulle fungera. Kanske för att icecast2 är så självklart enkel, enklare än vad jag trodde.
Processen jag beskriver är för en Debian Squeeze server men borde i stort sätt vara den samma för ett Ubuntu system. Lösenorden jag använder är givetvis fingerade, använd programmet makepasswd för att generera egna. Servernamnet media.server.com är också fingerat, byt mot egen domän eller IP nummer.
Installera med
sudo apt-get install icecast2 mdp makepasswd ncmpc dir2ogg
Redigera "/etc/icecast2/icecast.xml" och ställ åtminstone lösenorden. Redigera sedan "/etc/default/icecast2" och sätt sista raden till "ENABLE=true". Starta server med "/etc/init.d/icecast2 start".
Rensad och fungerande icecast.xml
<icecast>
<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>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65535</burst-size>
</limits>
<authentication>
<!-- Sources log in with username 'source' -->
<source-password>hack</source-password>
<!-- Relays log in username 'relay' -->
<relay-password>hackamer</relay-password>
<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>adminhack</admin-password>
</authentication>
<hostname>media.server.com</hostname>
<listen-socket>
<port>8000</port>
</listen-socket>
<mount>
<mount-name>/stream.ogg</mount-name>
<max-listeners>1</max-listeners>
<authentication type="htpasswd">
<option name="filename" value="/etc/icecast2/myauth"/>
<option name="allow_duplicate_users" value="0"/>
</authentication>
<on-connect>/home/icecast/bin/stream-start</on-connect>
<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
</mount>
<!-- Denna ligger i "/usr/share/icecast2/web/" mp3 funkar också -->
<mount>
<mount-name>/Ljudfil.ogg</mount-name>
<max-listeners>5</max-listeners>
<public>1</public>
<hidden>0</hidden>
<stream-name>Va'du Vill</stream-name>
<stream-description>Testa ljudet</stream-description>
<genre>Alternativ</genre>
<on-connect>/home/icecast/bin/stream-start</on-connect>
<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
</mount>
<fileserve>1</fileserve>
<paths>
<basedir>/usr/share/icecast2</basedir>
<logdir>/var/log/icecast2</logdir>
<webroot>/usr/share/icecast2/web</webroot>
<adminroot>/usr/share/icecast2/admin</adminroot>
<alias source="/" dest="/status.xsl"/>
</paths>
<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<playlistlog>playlist.log</playlistlog>
<loglevel>3</loglevel>
<logsize>10000</logsize>
</logging>
<security>
<chroot>0</chroot>
</security>
</icecast>
Kolla att det funkar (logga in med "admin" och "adminlösenordet" från icecast.xml):
http://media.server.com:8000/admin/stats.xsl
För att "authentication" ska fungera, skapa en fil i t.ex. /etc/icecast2/myauth med htpasswd. OBS! Det är viktigt att sätta rättigheterna till icecast2 om webbadmin gränssnittet ska fungera.
sudo htpasswd -c /etc/icecast2/myauth användarnamn
(skriv in ett lösenord)
sudo chown icecast2:icecast /etc/icecast2/myauth
mpd
OBS! Notera att debian versionen av mpd inte är kompilerat med stöd för mp3 så ljudet som ska stömmas bör vara i formatet ogg vorbis. Kompilera själv om du vill ha mp3 stöd.
Rensad och fungerande /etc/mpd.conf
music_directory "/var/lib/mpd/music"
playlist_directory "/var/lib/mpd/playlists"
db_file "/var/lib/mpd/tag_cache"
log_file "/var/log/mpd/mpd.log"
pid_file "/var/run/mpd/pid"
state_file "/var/lib/mpd/state"
#user "mpd"
#log_level "default"
log_level "verbose"
audio_output {
type "alsa"
name "fake out"
driver "null"
}
audio_output {
type "shout"
protocol "icecast2"
name "Cells Beta"
description "Hans E Andersson Music Production"
genre "jazz"
#encoder "ogg"
host "127.0.0.1"
port "8000"
mount "/stream.ogg"
password "hack" # samma lösenord som source i icecast.xml
quality "6.0"
format "44100:16:2"
user "source"
}
filesystem_charset "UTF-8"
id3v1_encoding "UTF-8"
Spela upp
Mpd spelar inte av sig själv, grundläggande status är "stop". För att få igång den måste en klient användas. Klienten, i mitt fall, är ett program som körs från samma server som mpd är installerat i. Ett program är "ncmpc" för att sätta igång en spellista, ett annat är "mpc". När den är slut så slutar också klienten höra något. Använ t.ex. VLC för att lyssna:
http://användarnamn:lösenord@media.server.com:8000/stream.ogg
OBS! Om inget spelas på servern så är det bra att ha en fallback-fil (/usr/share/icecast2/web/silence.ogg), om inte spellistan är igång. Lägg till i "icecast.xml" raden under <mount-name>/stream.ogg</mount-name>:
<mount>
<mount-name>/stream.ogg</mount-name>
<fallback-mount>/silence.ogg</fallback-mount>
<fallback-override>1</fallback-override>
<max-listeners>1</max-listeners>
<authentication type="htpasswd">
<option name="filename" value="/etc/icecast2/myauth"/>
<option name="allow_duplicate_users" value="0"/>
</authentication>
<on-connect>/home/icecast/bin/stream-start</on-connect>
<on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
</mount>
Ett klient program att sätta igång mpd är mpc
mpc ls | mpc add
mpc play|stop|pause
mpc stats
Sista raden ger resultatet
Artists: 0
Albums: 0
Songs: 10
Play Time: 0 days, 0:30:21
Uptime: 0 days, 0:38:06
DB Updated: Wed Aug 24 01:21:20 2011
DB Play Time: 0 days, 0:34:27
Skapa en spellista i "/var/lib/mpd/playlists/MyPlaylist.m3u"
mpc save MyPlaylist
Exempel för att spela upp låt nr 1 i spellistan:
mpc play 1
mpc repeat on
mpc random on
Av någon anledning som jag ännu inte vet har ljudkvaliteten varit bätte och mindre problemfylld med npmpc. Om det krånglar se till att inte två klienter spelar samtidigt
ps aux | grep mpc
ps aux | grep npmpc
Personligen gillar jag npmpc bäst.
Spela statiska filer och spellistor
Detta är något mycket enkelt att åstadkomma med icecast2. Här behövs inga inställningar i icecast.xml, se bara till att det som ska spelas upp ligger i /usr/share/icecast2/web mappen (symboliska länkar funkar också bra). Här fungerar icecast mest som en webserver och följande kan lika gärna göras med apache webserver.
Om du gjort en mount-post i icecast.xml där du kräver autencitering, spela upp en fil med:
http://användare:lösenord@media.server.com:8000/Ljud/EnLjudfil.mp3
Om du inte gjort någon mount-post i icecast så räcker det med:
http://media.server.com:8000/Ljud/EnLjudfil.mp3
Skapa en enkel spellista:
cd /usr/share/icecast2/web
sudo ls -1 >Spellista.m3u Ljud/*.mp3
M3U Syntax
#EXTM3U - header - måste vara på första raden
#EXTINF:längd (sekunder), Sven Bertil Taube - Sjörövarfabbe (Titel)
Skapa en m3u spellista med mp3info
cd /usr/share/icecast2/web
sudo mp3info -p "#EXTINF:%S,%a - %f %l (%y)\n%F\n" Ljud/*.mp3 > Spellista.m3u
Lägg till "#EXTM3U" överst, om man ska vara noga ska filen vara formaterad i Windows-1252 format för att förstås av mediaspelare.
#EXTM3U
#EXTINF:362,Hans E Andersson - AdLib.mp3 Cells (2011)
Ljud/AdLib.mp3
#EXTINF:280,Hans E. Andersson - ArpJam.mp3 HEAP Sounds (2011)
Ljud/ArpJam.mp3
#EXTINF:468,Hans E. Andersson - Barncells.mp3 HEAP Sounds (2011)
Ljud/Barncells.mp3
...
Spela upp med
http://media.server.com:8000/Spellista.m3u
Stömma m3u spellista till iPhone
Skapa en ny spellista
mp3info -p "http://media.server.com:8000/%F\n" Musik/*.mp3 > spellista.m3u
Det är viktigt att inkludera hela sökvägen till filen. Här struntade jag i M3U syntaxen och lät filen vara platt och rak. För att undvika problem rekomenderar jag att filnamnen inte innehåller svenska tecken, mellanrum och annat konstigt. Så här enkel bör spellistan vara:
http://media.server.com:8000/Musik/Jojo.mp3
http://media.server.com:8000/Musik/JamJam.mp3
http://media.server.com:8000/Musik/Bompa.mp3
...
Skriv in länken i iPhone Safari
http://media.server.com:8000/spellista.m3u
(Den här typen av spellista fungerar också med iTunes)