Tech FEATURE

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.

Kieskeurig
Geen producten gevonden.

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.

We installeren Raspberry Pi OS direct met de juiste configuratie.

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.

Htop geeft inzicht in het processor- en geheugengebruik.

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

We installeren Mopidy en de Music Player Daemon.

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.

Stel de standaarduitgang voor audio in op de Pi.

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.

Stel indien nodig het gewenste volume vooraf in.

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

We passen de configuratie voor Mopidy aan.

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

Je kunt een waarschuwing ontvangen bij de installatie van Iris.

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.

Vanaf een ander systeem heb je toegang tot Iris.

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.

Via enkele eenvoudige stappen voeg je TuneIn toe.

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.

Via Iris kun je nu enkele radiozenders afspelen.

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.

Je kunt lokale muziek beschikbaar maken binnen Iris.

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.

Vanuit Iris kun je een lokale scan uitvoeren om je muziek te indexeren.

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.

We gaan Snapserver installeren om te streamen naar de clients.

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.

We passen de configuratie van Snapserver aan.

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.

Pas de configuratie aan zodat Mopidy uitvoert naar Snapserver.

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.

Snapweb is een handige UI voor Snapserver.

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.

Controleer de aangesloten geluidssystemen.

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.

De configuratie van de client is eenvoudig.

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

De extensie voor Spotify voor Mopidy is niet voldoende stabiel.

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.

Na de integratie kun je direct afspelen via Spotify Connect.
Kieskeurig
Geen producten gevonden.