Synchrone multiroom-audio: streamen met Mopidy en Snapcast
De Raspberry Pi is heel geschikt als muziekserver of -speler, zo bewijzen toepassingen als Volumio en Navidrome. Weinig toepassingen zijn zo flexibel als Mopidy. Zo kun je via extensies verschillende bronnen toevoegen, waaronder je lokale muziek maar ook bijvoorbeeld TuneIn, YouTube Music, SoundCloud of radiostations. Voor de bediening kun je een webinterface, een van de vele apps of Home Assistant gebruiken.
Mopidy kan standaard niet streamen naar andere luidsprekers in huis, maar dat is eenvoudig op te lossen met Snapcast. De Snapserver, die je op het systeem met Mopidy installeert, pikt in feite de uitvoer van Mopidy op en streamt die synchroon naar meerdere kamers in huis.
In deze masterclass gaan we eerst met Mopidy aan de slag op een Raspberry Pi 4, die we ook als lokale speler gaan gebruiken. In het tweede deel voegen we Snapcast toe en enkele clients. Daarbij voegen we ook Spotify Connect toe als extra bron. Op de clients kun je dan kiezen naar welke bron je wilt luisteren (Mopidy of Spotify). Behalve de Pi zou je ook een Linux-server kunnen gebruiken voor Mopidy. Een server is minder logisch als lokale speler, maar voor het streamen naar spelers in je netwerk (met Snapcast) is het zeker een goede optie.
Geschikte besturingssystemen voor Mopidy
Voor het hoofdsysteem met Mopidy gebruiken we een Raspberry Pi met Raspberry Pi OS. We kiezen hierbij het oudere Debian 12 (Bookworm) in plaats van Debian 13 (Trixie). Trixie bevat namelijk een niet-compatibele versie van GStreamer (1.26.2). Dat geeft problemen bij het spelen van streams, door een (onbedoelde) API-wijziging in GStreamer. De keuze voor Bookworm is de eenvoudigste route. Op een server kun je prima met Ubuntu 24.04.x LTS werken, dat ook ‘veilig’ is omdat het een oudere versie van GStreamer gebruikt (1.24.2). Voor aparte Snapcast-clients kun je wél met Trixie werken.
Geheugenkaart flashen
Voor het beschrijven van een microSD-kaart gebruiken we Raspberry Pi Imager. Selecteer hierin eerst het model Pi. Kies als besturingssysteem onder Raspberry Pi OS (other) voor Bookworm, veelal omschreven als Raspberry Pi OS (Legacy, 64-bit) Lite. Selecteer je opslagapparaat en klik op Volgende. Kies voor het aanpassen van de instellingen voor headless gebruik. Zet een vinkje bij Hostnaam en vul een naam in, zoals mopidy. Je kunt dan verbinden via mopidy.local. Zet een vinkje bij Gebruikersnaam en wachtwoord instellen en voer de gewenste accountgegevens in. Je kunt daarmee straks op afstand inloggen. Ga je geen netwerkkabel aansluiten? Zet dan een vinkje bij Wifi instellen, voer de naam en het wachtwoord van je wifi-netwerk in en selecteer je land. Zet een vinkje bij Regio instellingen en selecteer de tijdzone (Europe/Amsterdam). Ga naar Services, zet een vinkje bij SSH inschakelen en kies Gebruik wachtwoord authenticatie. Kies ten slotte Opslaan. Bevestig dat jouw instellingen toegepast moeten worden op het OS en rond de creatie van de microSD-kaart af.
Inloggen en bijwerken
Na het starten van de Pi met de microSD-kaart kun je, als alles goed is ingesteld, direct inloggen vanaf een ander systeem middels SSH, bijvoorbeeld met PuTTY. Begin met het bijwerken van het besturingssysteem:
sudo apt update && sudo apt full-upgrade -y
Installeer ook enkele basistools. De tool htop is handig om inzicht te krijgen in het processor- en geheugengebruik en de belangrijkste achtergrondprocessen. Via alsa-utils installeer je hulpmiddelen om met de geluidskaart te werken. Je installeert ze zo:
sudo apt install -y git curl htop alsa-utils
In de volgende stap gaan we Mopidy installeren.
Installatie Mopidy
Je kunt Mopidy zelf en veel extensies eenvoudig via de pakketbronnen installeren. Sommige andere extensies installeer je via Python. Voeg eerst de gpg-sleutel van het Mopidy-archief toe:
sudo mkdir -p /etc/apt/keyrings
sudo wget -q -O /etc/apt/keyrings/mopidy-archive-keyring.gpg https://apt.mopidy.com/mopidy.gpg
Voeg dan de repository van Mopidy toe aan je pakketbronnen. Zo weet het systeem waar het Mopidy kan vinden. Dit doe je als volgt:
sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/bookworm.list
Vernieuw de pakketbronnen en installeer Mopidy en de Music Player Daemon (MPD):
sudo apt update
sudo apt install mopidy mopidy-mpd
Controleer of Mopidy is geïnstalleerd en in welke versie:
mopidy --version
Mopidy wordt standaard met een systemd-service geïnstalleerd. Activeer die met de volgende opdracht, zodat Mopidy automatisch start bij het opstarten:
sudo systemctl enable mopidy
Start Mopidy en controleer de status:
sudo systemctl start mopidy
sudo systemctl status mopidy
Audio instellen
Zorg dat je een geluidssysteem hebt aangesloten op de Pi (zie kader) en stel dit als standaarduitgang in. Open hiervoor de configuratie van de Pi met sudo raspi-config. Ga dan naar System Options / Audio en kies het geluidssysteem. Hier kiezen we de usb-DAC genaamd E30, waarmee de aangesloten Topping E30 wordt bedoeld. Vervolgens kun je de systeemaudio testen via alsa (Advanced Linux Sound Architecture), het onderliggende audiosysteem van Linux. Daar geven we in de volgende stap enkele tips voor. Je kunt de beschikbare afspeelapparaten controleren met aplay -l. In ons voorbeeld zien we onder meer de volgende regels:
card 0: Headphones [bcm2835], device 0: bcm2835 Headphones [bcm2835]
card 3: E30 [E30], device 0: USB Audio [USB Audio]
Je kunt Mopidy eventueel expliciet via één van deze apparaten laten afspelen in plaats van via de standaarduitgang. Noteer in dat geval de nummers achter card en device, of beter nog de naam tussen [] zoals E30.
Uitvoermogelijkheden voor audio op de Pi
Je hebt veel mogelijkheden voor het uitvoeren van audio op de Pi. Om te beginnen zou je (in ieder geval op de Pi 4) de standaard 3,5mm-hoofdtelefoonuitgang kunnen gebruiken. Dat is handig om de werking te testen, maar het geeft geen hoge geluidskwaliteit. Betere opties zijn de HDMI-uitgang, een usb-DAC of audio-hat. Uitvoer via HDMI werkt direct. Een usb-DAC wordt meestal ook automatisch herkend nadat je die hebt aangesloten. Voor een hat die je bovenop de GPIO-pinnen prikt, is wat extra configuratie nodig, zoals het uitschakelen van de interne audiochip en het activeren van de overlay.
Syteemaudio testen
Test je geluidssysteem door bijvoorbeeld een toon van 440 Hz af te spelen op beide kanalen:
speaker-test -t sine -f 440 -c 2
Je kunt ook een stem afspelen die ‘Front Center’ zegt:
aplay /usr/share/sounds/alsa/Front_Center.wav
Hoor je niets? Controleer dan het volume met alsamixer. Via PijltjeOmhoog en PijltjeOmlaag kun je het volume regelen. Verlaat de toepassing met Esc. Bewaar eventueel de instellingen met sudo alsactl store. De huidige volumes worden dan hersteld na een herstart van de Pi. Je kunt ook testen met mpg123, een licht programma dat rechtstreeks mp3-bestanden of streams kan afspelen. Installeer het met sudo apt install mpg123 en start een stream met bijvoorbeeld:
mpg123 http://icecast.omroep.nl/radio2-bb-mp3
Je kunt ook via GStreamer, dat al samen met Mopidy werd geïnstalleerd, een stream afspelen:
gst-launch-1.0 playbin uri=http://icecast.omroep.nl/radio2-bb-mp3
Als het werkt, heb je óók meteen bevestiging dat GStreamer werkt en dat de Pi de stream kan decoderen. Je kunt de uitvoer stoppen met Ctrl+C.
Configuratie Mopidy
Mopidy stuurt zijn audio via GStreamer, dat zelf een geschikte uitgang kiest. Om te voorkomen dat Mopidy hierdoor soms de ‘verkeerde’ route kiest, is het zeker voor een standalone speler handig om specifieker te zijn. Zet hiervoor onderstaande regels in het configuratiebestand van Mopidy. Lees eerst het kader met belangrijke aanwijzingen voor zulke wijzigingen! Voeg vervolgens deze regels toe:
[audio]
mixer = software
output = alsasink
Je kunt Mopidy eventueel dwingen om een specifieke uitgang te gebruiken, bijvoorbeeld de usb-DAC. In ons voorbeeld met card 3 en device 0 noteer je dat als volgt:
[audio]
output = alsasink device=hw:3,0
Omdat deze nummers kunnen veranderen, is het veiliger om de naam te gebruiken. Voor de Topping E30 gebruiken we daarom:
[audio]
output = alsasink device=hw:E30
Je kunt dit eventueel vooraf testen met:
gst-launch-1.0 audiotestsrc ! alsasink device=hw:E30
Configuratiebestanden voor Mopidy
Mopidy kent vaak meerdere configuratiebestanden. We werken in deze masterclass alleen met de systeemconfiguratie. Dat is het bestand /etc/mopidy/mopidy.conf. Je kunt het aanpassen met sudo nano /etc/mopidy/mopidy.conf. Standaard is het configuratiebestand leeg en soms zelfs afwezig. Mopidy gebruikt in dat geval zijn standaardinstellingen die je via dit configuratiebestand kunt ‘overschrijven’. Bewaar wijzigingen in de editor nano met Ctrl+O en verlaat de editor met Ctrl+X. Controleer daarna de geldende configuratie met sudo mopidyctl config. Het is ten slotte belangrijk om Mopidy na wijzigingen te herstarten met sudo systemctl restart mopidy!
Iris installeren
Iris is een mooie webinterface voor het afspelen van muziek en bladeren door de verschillende bronnen die je via extensies toevoegt. Installeer vooraf pip (Python Package Installer) en enkele afhankelijkheden:
sudo apt install python3-pip python3-wheel
Installeer daarna Iris in de systeem-Python:
sudo python3 -m pip install Mopidy-Iris
Mogelijk krijg je een waarschuwing dat je iets in de systeem-Python probeert te installeren. Dat kun je eventueel anders oplossen, maar het is geen bezwaar om de installatie te forceren met:
sudo python3 -m pip install Mopidy-Iris --break-system-packages
Configuratie aanpassen
Voeg nu regels toe aan de configuratie van Mopidy. Hiermee maken we Iris actief en zetten de webserver en de Media Player Daemon (mpd) open voor toegang vanaf het netwerk. Dit zijn de toe te voegen regels:
[http]
enabled = true
hostname = 0.0.0.0
port = 6680
zeroconf = Mopidy HTTP server on $hostname
[iris]
enabled = true
country = NL
locale = nl_NL
[mpd]
enabled = true
hostname = 0.0.0.0
port = 6600
Herstart Mopidy en open met een browser het adres http://ipadres:6680/iris. Daar zie je de moderne interface van Iris. Kies bij Username een gebruikersnaam en klik op Save om verder te gaan. Onder Settings kun je eventueel omschakelen naar de Nederlandse taal. Ook kun je hier straks Snapcast activeren, zodat je dit binnen Iris kunt bedienen.
TuneIn toevoegen
Via TuneIn kun je eenvoudig talloze radiostations vinden. Je kunt het via één commando installeren:
sudo apt install mopidy-tunein
Voeg daarna de onderstaande regels toe aan de configuratie:
[tunein]
enabled = true
timeout = 5000
filter = station
Herstart Mopidy en open Iris. Ga naar Bladeren en kies TuneIn. Hier kun je talloze bekende en onbekende radiostations opzoeken en afspelen.
Radiostations toevoegen
Je kunt ook handmatig een afspeellijst met enkele radiostations maken. De benodigde m3u-extensie is standaard al ingeschakeld. Voeg onderstaande regels aan de configuratie toe, zodat Mopidy weet waar het afspeellijsten moet zoeken:
[m3u]
enabled = true
playlists_dir = /var/lib/mopidy/m3u
base_dir = /var/lib/mopidy/m3u
Maak nu bij voorkeur eerst via Iris een afspeellijst, dan staan de bestandsrechten meteen goed. Ga hiervoor in Iris naar Afspeellijsten, kies Toevoegen en vul een naam in (zoals radio). Ga daarna via de opdrachtprompt met cd /var/lib/mopidy/m3u naar deze standaardmap voor afspeellijsten, waar je het bestand al ziet. Bewerk het en zet er bijvoorbeeld de onderstaande regels in:
#EXTM3U
#EXTINF:-1,NPO Radio 2
http://icecast.omroep.nl/radio2-bb-mp3
#EXTINF:-1,NPO 3FM
http://icecast.omroep.nl/3fm-bb-mp3
#EXTINF:-1,Radio 538
https://22733.live.streamtheworld.com/RADIO538.mp3
In Iris kun je nu via deze afspeellijst de genoemde radiostations afspelen. Je kunt ook in Iris, bijvoorbeeld vanuit het aanbod van TuneIn, radiostations aan deze afspeellijst toevoegen.
NAS mounten
Je kunt een lokale muziekverzameling of je muziek op een NAS aan Mopidy toevoegen. Hiervoor moet je de map eerst koppelen ofwel mounten. Installeer indien nodig deze tools:
sudo apt install cifs-utils
Maak dan een map voor deze mount, zoals:
sudo mkdir -p /mnt/music
Bewerk het configuratiebestand met mounts via sudo nano /etc/fstab en voeg onderaan de volgende enkele regel toe:
//192.168.1.50/Music /mnt/music cifs username=gebruiker,password=wachtwoord,iocharset=utf8,uid=mopidy,gid=audio,file_mode=0660,dir_mode=0770 0 0
Vervang 192.168.1.50 door het ip-adres van je NAS. Bij username en password vul je de toegangsgegevens voor deze map op de NAS toe. Het is handig hiervoor een apart gebruikersaccount te maken, die je lees- en schrijftoegang tot die map geeft. Herlaad de configuratie en maak het actief:
sudo systemctl daemon-reload
sudo mount -a
Controleer met ls /mnt/music of je muziek beschikbaar is. Je kunt het in de volgende stap toevoegen en scannen, zodat je binnen Iris door je artiesten en albums kunt bladeren.
Toevoegen en scannen
Mopidy biedt standaard de file-extensie voor het bladeren door je bestandssysteem en afspelen van bestanden. Open hiervoor de configuratie van Mopidy met sudo nano /etc/mopidy/mopidy.conf en voeg deze regels toe:
[file]
enabled = true
media_dirs =
/mnt/music|Muziek
Bij een grotere muziekverzameling wil je muziek ook laten indexeren. Hiervoor installeer je de extensie local:
sudo apt install mopidy-local
Voeg dan deze regels toe:
[local]
enabled = true
media_dir = /mnt/music
scan_timeout = 10000
Herstart Mopidy en start handmatig een scan met sudo mopidyctl local scan. Of start deze scan in Iris, onder Instellingen.
Snapserver installeren
We hebben Mopidy nu geïnstalleerd op de Raspberry Pi 4 en verschillende extensies toegevoegd om naar diverse bronnen te luisteren op het aangesloten geluidssysteem. In dit deel gaan we Snapserver toevoegen. Daarmee kun je in meerdere kamers perfect synchroon naar deze audiobronnen luisteren. De truc is om de uitvoer van Mopidy aan te bieden bij Snapserver, die dit vervolgens streamt naar de verschillende Snapcast-clients. Je kunt van je hoofdsysteem met Mopidy een Snapcast-client maken, maar je kunt ook andere systemen toevoegen. Bijvoorbeeld een Raspberry Pi Zero W en uiteraard een eigen geluidssysteem.
Configuratie
Snapserver is in de officiële repositories aanwezig en installeer je met sudo apt install snapserver. De dienst start daarna automatisch. We verwijderen de voorbeeldconfiguratie en maken een nieuwe:
sudo mv /etc/snapserver.conf /etc/snapserver.conf.bak
sudo nano /etc/snapserver.conf
We kiezen in onze configuratie voor een kleine buffer van 1000 ms (1 seconde), zodat je maar kort hoeft te wachten bij bijvoorbeeld het skippen van nummers. Bij zwakke wifi-clients moet je de buffer soms wat verhogen. Verder kiezen we voor een tcp-stream. Je kunt ook een bestand (fifo) gebruiken, maar dat is foutgevoeliger. Dit is de configuratie:
[server]
buffer = 1000
[stream]
source = tcp://127.0.0.1?name=Mopidy
sampleformat = 48000:16:2
codec = flac
[http]
enabled = true
bind_to_address = 0.0.0.0
port = 1780
doc_root = /usr/share/snapserver/snapweb/
De waarden bij sampleformat en codec regelen dat Snapserver alle audio intern als flac met 48 kHz en 16-bit stereo doorstuurt naar de Snapclients.
Aanpassing Mopidy
Pas de configuratie van Mopidy aan zodat het uitvoert naar Snapserver in plaats van naar alsa. Hiervoor hoef je alleen de waarde bij output onder het kopje [audio] te veranderen:
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! tcpclientsink host=127.0.0.1 port=4953
De opties audioresample en audioconvert laten Mopidy alles netjes omzetten naar het gewenste formaat (48 kHz en 16-bit stereo), ongeacht wat de bron is. Herstart Mopidy na deze aanpassing.
Snapweb UI
Snapserver heeft een webinterface die zicht geeft op de verschillende actieve spelers. Bezoek deze via http://ipadres:1780. Bestaat de map /usr/share/snapserver/snapweb/ nog niet? Dan moet je de map en de inhoud zelf toevoegen:
sudo mkdir -p /usr/share/snapserver/snapweb
cd /usr/share/snapserver/snapweb
sudo wget https://github.com/badaix/snapweb/releases/latest/download/snapweb.zip
sudo apt install unzip -y
sudo unzip snapweb.zip
sudo rm snapweb.zip
Herstart hierna Snapserver:
sudo systemctl restart snapserver
Bezoek opnieuw de Snapweb UI en ververs de pagina. Je kunt via het speelicoontje meeluisteren op het apparaat waarmee je deze pagina bezoekt, zoals een pc of tablet. Een browser kan door zijn eigen buffering soms wel iets uit de pas lopen.
Meer bedieningsopties voor Snapserver
In Iris kun je eenvoudig bedieningselementen voor Snapserver toevoegen. Ga hiervoor naar Instellingen, klik op Snapcast en vul bij Host het ip-adres van het systeem met Snapserver in. Via het luidsprekericoontje onderaan kun je nu het volume van de clients bedienen of een bron per client kiezen. Ook Home Assistant biedt handige integraties, zowel voor Mopidy als Snapserver.
Snapclient voorbereiden
Voor de clients met Snapcast liggen de eisen niet zo hoog. Een Pi Zero 2 W is een mooie optie. Je kunt Trixie gebruiken of een andere recente editie van Debian. Wij kiezen Raspberry Pi OS Lite (64-bit). Dat is Trixie zonder desktopomgeving. Voor het beschrijven van de microSD-kaart met Raspberry Pi Imager gebruiken we dezelfde instellingen als eerder, maar kiezen een andere hostnaam (bijvoorbeeld mopidykeuken.local), zodat je de client makkelijk herkent. Start de Pi op, log in met SSH en werk het systeem bij:
sudo apt update && sudo apt full-upgrade -y
Snapcast zit in de officiële Debian-repository sinds Bullseye, dus je installeert het eenvoudig met:
sudo apt install snapclient
Bekijk via aplay -l welke geluidssystemen zijn aangesloten. Je kunt net als eerder de waardes voor card en device gebruiken of de naam.
Snapclient configuratie
Voor de configuratie van de client hoef je naast het geluidssysteem alleen het ip-adres van de Snapserver te kennen. Open het configuratiebestand:
sudo nano /etc/default/snapclient
Geef dan de onderstaande configuratie op. Hierin kun je de waardes voor card en device invullen:
# IP of hostname van je Snapserver
SNAPCLIENT_OPTS="-h 10.0.10.52 --soundcard plughw:3,0 "
Vervang 10.0.10.52 door het correcte ip-adres van het hoofdsysteem met Snapserver. Het is ook hier weer veiliger om de naam te gebruiken zoals E30. Dat kan als volgt:
SNAPCLIENT_OPTS="-h 10.0.10.52 --soundcard default:CARD=E30"
Herstart na de aanpassingen de service:
sudo systemctl restart snapclient
Als het goed is, hoor je nu de stream van Snapserver.
Spotify Connect
Voor Spotify-integratie bestaat weliswaar een Mopidy-extensie, maar die weigert regelmatig door wijzigingen aan de kant van Spotify. Daarom kiezen we voor Spotify Connect. Je kunt dan vanaf je vertrouwde Spotify-client direct afspelen naar je Pi. Dit maakt je opstelling onafhankelijk van API-wijzigingen bij Spotify. We installeren hiervoor Raspotify met de onderstaande opdracht:
curl -sL https://dtcooper.github.io/raspotify/install.sh | sh
Dat is de eenvoudigste manier om de benodigde bibliotheken voor Librespot te installeren. We hebben Raspotify zelf niet nodig. Je kunt het stoppen met deze opdracht:
sudo systemctl stop raspotify
Spotify-stream toevoegen
Normaal zitten Mopidy en Raspotify elkaar een beetje in de weg omdat ze beide uitvoeren naar hetzelfde geluidssysteem via alsa. Met Snapserver is dat geen probleem. Je kunt Spotify gewoon als extra bron toevoegen, waarbij elke client een bron (Mopidy of Spotify) kan kiezen. Je hoeft in de configuratie van Snapserver, onder het kopje [stream], alleen de extra stream toe te voegen. De configuratie ziet er dan als volgt uit:
[stream]
source = tcp://127.0.0.1?name=Mopidy
source = spotify://librespot?name=Spotify&bitrate=320&devicename=PiSpot
sampleformat = 48000:16:2
codec = flac
Na het herstarten van Snapserver met sudo systemctl restart snapserver zal Snapserver de streams van Mopidy én Spotify Connect ontvangen. Vanaf je Spotify-app kun je PiSpot als luidspreker kiezen. We kiezen voor een bitrate van 320 kbit/s. Per Snapcast-client of per groep kun je de gewenste bron kiezen (Mopidy of Spotify). Mopidy of Spotify worden dan perfect gesynchroniseerd over alle kamers afgespeeld.



