Streamen met MPD

Er zijn twee methodes om overal toegang te hebben tot jouw muziekcollectie. Ofwel kopieer je de volledige collectie naar je smartphone, ofwel stream je ze rechtstreeks vanaf je homeserver. In deze workshop zoeken we uit wat je nodig hebt voor de tweede optie.

Uiteraard kan je je jouw muziekcollectie in bijvoorbeeld mp3-formaat kopiëren naar je smartphone. Op zich is dat een prima oplossing, maar er kleven wel enkele nadelen aan. Heb je je collectie geïmporteerd in flac-formaat, dan moet je een tweede versie onderhouden in mp3-formaat. Elke wijziging aan je collectie (tags aanpassen, bestanden verplaatsen, enzovoorts) moet je tweemaal uitvoeren. Nadien mag je niet vergeten om de mp3-versie te synchroniseren met je smartphone. En ook al beschikken smartphones over steeds meer opslagruimte, voor fanatieke muziekliefhebbers is het best mogelijk dat de collectie te groot is om volledig te kopiëren. Die problemen los je op door je muziek rechtstreeks te streamen vanaf je homeserver over internet. In deze workshop gaan we aan de slag met MPD, DynDNS en ssh om een streaming-oplossing te bouwen met een BeagleBone Black.

 

Ssh beveiligen

Om te streamen vanaf ons thuisnetwerk, moeten we via internet aan onze Linux-server kunnen. Het is geen goed idee om ssh-toegang zomaar open te zetten voor het hele internet. Binnen de kortste keren zie je dan honderden login-pogingen verschijnen in de logfiles. Daarom raden we je aan om een aantal extra beveiligingsmaatregelen te nemen. Log om te beginnen aan op je server met je persoonlijke account. Switch vervolgens naar de root-gebruiker (met su of sudo) en open het bestand /etc/ssh/sshd_config. Schakel eerst en vooral rechtstreeks inloggen als root uit:

PermitRootLogin no

Wijzigingen aan sshd_config lees je in met:

service sshd reload

Dat maakt het al een stuk moeilijker voor brute force attacks om binnen te geraken, want nu moet men zowel je gebruikersnaam als jouw wachtwoord raden. Wil je het helemaal onmogelijk maken om binnen te geraken door een wachtwoord te raden? Schakel dan wachtwoordauthenticatie volledig uit. Je kan dan enkel inloggen met een geldige private key, zelfs indien je het juiste wachtwoord zou kennen. Uiteraard moet je een dergelijke key wél beveiligen met een veilige passphrase. Doe je dat niet, dan kan iedereen die de key in handen krijgt alsnog aanloggen op je server!

Geen wachtwoord meer

Authenticatie met een public/private key pair zet je in verschillende stappen op:

– genereer een public/private key pair op je client en kies een voldoende lange passphrase om de key te beveiligen: ssh-keygen

– kopieer de public key naar je server: ssh-copy-id <gebruiker>@<ip-adres-server>

– probeer in te loggen op je server om te zien of de key werkt: daarbij moet je de key passphrase ingeven

– als je kan inloggen met de key, schakel je wachtwoordauthenticatie uit in /etc/ssh/sshd_config (gevolgd door het commando service sshd reload):

PasswordAuthentication no

– probeer nu in te loggen zonder de key:

ssh -o PreferredAuthentications=password <gebruiker>@<ip-adres-server>

…en je krijgt onmiddellijk een permission denied error, zonder enige kans om een wachtwoord in te geven!

Het is trouwens een goed idee om een extra gebruiker aan te maken op je server met beperkte rechten (zoals geen sudo-toegang). Die gebruiker dient dan enkel om de streaming-verbinding op te zetten.

 

MPD

Nu ssh voldoende beveiligd is, gaan we MPD configureren voor gebruik in ons lan. De Music Player Daemon is eigenlijk geen muziekspeler, maar een muziekserver. MPD beheert de database van alle muzieknummers, leest de tags in en geeft de gevraagde muzieknummers door aan een MPD-client. Tags bewerken of cd’s importeren is niet mogelijk: daarvoor gebruik je afzonderlijke tools. Je hebt dus vier verschillende programma’s nodig om de taken uit te voeren die je in pakweg Rythmbox of Banshee doet. Dat is behoorlijk omslachtig als je je collectie maar op één computer wilt afspelen. Anderzijds biedt de client/server-architectuur enorm veel flexibiliteit om je muziek op verschillende apparaten af te spelen. Verschillende clients kunnen tegelijkertijd verbinden met dezelfde server en al dan niet dezelfde nummers afspelen. In deze workshop gaan we niet te diep in op MPD’s geavanceerde features. Ons doel is om muziek af te spelen via een Linux-client of een Android-smartphone over internet.

 

Installatie

Gebruik je voor je streaming server een Raspberry Pi of BeagleBone Black zoals wij, dan draai je allicht een Debian-gebaseerde distributie. MPD installeer je daarin via het mpd-pakket:

apt install mpd

Laat je niet afschrikken door het grote aantal packages dat apt wilt installeren: maar liefst 100 op onze BeagleBone! Die heb je niet allemaal meteen nodig, maar zo is je systeem wel al klaar om later een meer geavanceerde MPD-setup te configureren. Al bij al neemt de installatie van MPD ongeveer 120MB in beslag. Na installatie pas je het configuratiebestand /etc/mpd.conf aan. Vergeet niet om na elke wijziging de nieuwe configuratie in te lezen met:

service mpd restart

 

Configuratie

Eerst en vooral moet MPD de locatie van jouw muziekcollectie kennen. Die stel je in met de volgende optie:

music_directory  “/mnt/music”

Let op dat MPD draait als gebruiker “mpd” en groep “audio”. Controleer dus eerst of die gebruiker ten minste leestoegang heeft tot de music_directory. Indien nodig pas je de permissies van die map aan of voeg je de mpd-gebruiker toe aan een groep die wél toegang heeft tot die map. Standaard is MPD enkel toegankelijk voor localhost, dus jouw muziekserver zélf. Om MPD te kunnen testen in je lan, voeg je een tweede bind_to_address-lijn toe met het lan ip-adres van je server, bijvoorbeeld:

bind_to_address  “192.168.1.6”

Kies ook nog een naam voor jouw MPD-server (vooral handig als je meerdere MPD-daemons zou draaien in je netwerk):

zeroconf_name  “BeagleBone Black”

 

Output kiezen

Tenslotte moet je MPD nog vertellen welke audio output je wilt gebruiken. Natuurlijk wil je de muziek niet op je streaming server zélf afspelen, dus schakel je de alsa-output uit door een #-je te zetten aan het begin van volgende regels:

#audio_output {

#  type  “alsa”

#  name  “My ALSA Device”

#}

 

Scroll nu verder in het bestand tot je “An example of a httpd output” tegenkomt. Een minimale configuratie voor http streaming ziet er als volgt uit:

audio_output {

  type       “httpd”

  name       “BeagleBone Black”

  encoder    “vorbis”

  bitrate    “128”

  always_on  “yes”

}

De name mag je vrij kiezen, vervang “vorbis” door “lame” als je mp3 verkiest boven ogg. Herstart MPD en bekijk het bestand /var/log/mpd/mpd.log en de output van “service mpd status” om te controleren of MPD correct gestart is.

Een eerste test

Om snel te testen of MPD werkt, installeren we een grafische MPD-client op onze Linux-desktop. Als je zoekt op “mpd” in je package manager vind je waarschijnlijk tientallen clients. Als voorbeeld gebruiken we Ario, een Rhythmbox-lookalike MPD-client. Na installatie start Ario een wizard voor de initiële configuratie. Klik op “Auto detect” om te zoeken naar MPD-servers in je netwerk. Selecteer jouw server en klik op OK, Forward en Apply. Allereerst moet je MPD de opdracht geven om de muziek te indexeren via File > Update database. Wacht een aantal minuten tot het indexeren voltooid is. Je kan de voortgang ervan volgen in het logbestand /var/log/mpd/mpd.log op je server. Zodra dat voltooid is, kan je je collectie doorbladeren en muziek beginnen af te spelen. Dubbelklikken op een nummer voegt dat toe aan de playlist onderaan. Om het afspelen effectief te starten, klik je op de play-knop of dubbelklik je op een nummer in de playlist. De muziekcollectie doorbladeren of doorzoeken verloopt trouwens érg snel.

 

Geen geluid?

Hoewel Ario correct lijkt te werken, hoor je nog steeds geen geluid. Dat is normaal, want in het geval van http-streaming dient de MPD-client enkel om MPD te besturen. Om de stream effectief te beluisteren, moet je die nog openen in een andere speler. De eenvoudigste methode is via de webbased player op http://<ip-adres-server>:8000, maar die is vrij traag. Bij ons zat er bijna 10 seconden vertraging op de commando’s die we gaven in Ario. Een betere optie is VLC, via Media > Open Network Stream. Vul daar dezelfde url in en je beluistert de MPD-stream met een vertraging van ongeveer een seconde. De VLC-stream laat je gewoon altijd spelen. Pauzeren/stoppen/voortspoelen doe je via de MPD-client. Tijdens onze test merkten we trouwens dat een flac-bestand in realtime omzetten naar ogg teveel was voor onze BeagleBone Black. Het mpd-proces zat meteen tegen de 100% cpu-gebruik en de muziek haperde geregeld. Het afspelen van een mp3-stream verliep merkelijk vlotter en zat meestal rond de 70% cpu-gebruik. Toch verliep ook dat niet altijd helemaal probleemloos. Een moderne Raspberry Pi met betere specificaties dan een single core 1Ghz ARMv7-processor en 512MB RAM is misschien geen overbodige luxe.

 

Externe toegang

De meeste internetaansluitingen voor thuisgebruik hebben geen vast ip-adres. Dat betekent dat jouw adres om de paar weken kan veranderen en je dus nooit zeker weet op welk adres je moet verbinden. Met een DynDNS-client los je dat probleem op. Die kijkt na wat jouw extern ip-adres is en past bij elke wijziging een domeinnaam aan. Je verbindt dus met een bepaalde domeinnaam en de DynDNS-client zorgt ervoor dat die steeds naar het juiste adres verwijst. De bekendste aanbieder van dergelijke service is DynDNS, maar er bestaan verschillende alternatieven. In deze workshop gebruiken we DuckDNS. Dat werkt op verschillende platformen: Linux, routers, nas-apparaten, enzovoorts. Voor het gemak installeren we de DuckDNS-client bij op onze BeagleBone. Log eerst in via je Google-account op de DuckDNS-website en kies een domein, bijvoorbeeld linuxmag.duckdns.org. Volg daarna de instructies op https://www.duckdns.org/install.jsp (kies “linux cron”) om DuckDNS op je server te installeren. Dat hoeft trouwens niet als root: je doet dat best onder jouw gewone gebruiker. Vraag tot slot het ip-adres van jouw domeinnaam op om te controleren of alles werkt:

host linuxmag.duckdns.org

Nu moet je nog port forwarding configureren in je router. Als je verbindt op poort 22 op je externe ip-adres, moet de router dat forwarden naar poort 22 op jouw server. De precieze procedure verschilt van merk tot merk. In afbeelding 4 zie je een voorbeeld voor de Ubiquiti EdgeRouter Lite. De poort op je externe ip-adres mag je vrij kiezen. Het forward-to-adres is uiteraard het lan ip-adres van je MPD-server en de forward-to-poort is steeds 22.

 

Streamen naar Linux

Om jouw muziek te streamen naar een Linux-machine, ga je als volgt te werk. Je moet de poorten 6600 en 8000 forwarden over ssh naar jouw server:

ssh -L 6600:localhost:6600 filip@linuxmag.duckdns.org -fN

ssh -L 8000:localhost:8000 filip@linuxmag.duckdns.org -fN

 

Daarna verbind je je MPD-client met localhost:6600 en open je in VLC http://localhost:8000. In beide gevallen kom je via ssh over internet terecht op je server thuis. Dit werkt dus net zo goed bij jou thuis als elders. De enige vereiste is dat uitgaande verbindingen naar poort 22 niet geblokkeerd worden, bijvoorbeeld door een bedrijfsfirewall. Mochten de poorten 6600 of 8000 al door een ander programma in gebruik zijn op jouw Linux-client, dan krijg je een foutmelding. Vervang dan de eerste 6600 of 8000 in bovenstaande commando’s door een ander poortnummer dat hoger is dan 1023.

 

Streamen naar Android

Op Android heb je twee apps nodig om te kunnen streamen: Ki4a om de ssh-verbinding op te zetten en een MPD-client. De instellingen van Ki4a spreken voor zich: vul de domeinnaam, gebruikersnaam en private key in en voeg port forwarding regels toe voor poorten 6600 en 8000 zoals in de vorige paragraaf. “Enable DNS Forwarding” en “Send all traffic over VPN” mag je afvinken, tenzij je al het internetverkeer van je smartphone via je server thuis wilt sturen. Keer terug naar het hoofdscherm en klik op de rode bol om de ssh-verbinding op te starten. Als alles goed gaat, wordt die bol groenblauw en krijg je de melding “Connected” te zien. Open nu de MPD-client om die te configureren. In de Play Store vind je verschillende MPD-clients, zoals M.A.L.P., MPDroid of MPD Remote. Die eerste twee zijn iets gebruiksvriendelijker, maar op onze telefoon wilden die apps de audiostream niet starten. We hadden meer succes met MPD Remote. Na het starten ga je naar Settings > “Configure MPD servers” en klik je op de +-knop. Vul localhost en poortnummer 6600 en vink “Enable streaming” aan. Klik op Ok en tweemaal op de back-knop om verbinding te maken. Kies vervolgens de muziek die je wilt afspelen, klik op het icoontje met de drie puntjes rechtsboven en selecteer “Start streaming”. Wil je toch een andere app gebruiken, ga dan te werk zoals in Linux: je bestuurt MPD met de MPD-client en je speelt de stream af in VLC. In de VLC-app voor Android vind je die functie in de menubalk links onder de naam Stream.

Conclusie

In deze workshop hebben we één mogelijk MPD-configuratie uitgewerkt om te streamen over internet. MPD is erg flexibel en bevat nog tientallen opties die hier niet aan bod kwamen. Aarzel niet om verder te experimenteren met de documentatie in het configuratiebestand en op https://bit.ly/2qxI03O. Het loont ook de moeite om verschillende clients uit te testen, want ze werken niet allemaal intuïtief.