Für diesen Artikel fiel es mir schwer, einen passenden Titel zu finden. Bei GNU/Linux.ch habe ich schon viele Artikel über das Verwalten und Abspielen von Musik geschrieben. Das fing bei der vierteiligen Serie Raspi als NAS und Musikmaschine an, ging weiter mit YouPlay, den MPD-Clients ncmpcpp und Ymuse, sowie der Anleitung Musik im Terminal und findet seine Fortsetzung in diesem Beitrag. Der Titel könnte auch lauten: "Wie streamt man Musik im Server-Terminal (Raspi) an direkt angeschlossene Lautsprecher?"
Bevor ihr weiterlest, solltet ihr die Umgebung und den Anwendungsfall kennen:
- Ihr habt eine eigene lokale Musiksammlung oder möchtet Musik aus dem Internet streamen.
- Ihr verwendet den Music Player Daemon (MPD) oder möchtet Musik aus dem Internet streamen.
- Euer Musik-Server (z.B. Raspberry Pi) ist direkt (Line oder USB) mit der Audio-Anlage.
- Die Musikwiedergabe soll auf dem Server gesteuert werden (kein Smartphone- oder Notebook-Client)
Wie ihr seht, sind die Rahmenbedingungen ziemlich speziell. Hier kommt die Lösung:
Vorgeplänkel
Bisher habe ich noch keinen Beitrag darüber geschrieben, wie man den Music Player Client (MPC) verwendet. "Client" ist dafür das falsche Wort, weil MPC eigentlich ein Terminal-Programm auf dem MPD-Server ist. Möchte man einen echten MPD-Client haben, kann man Ymuse oder ncmpcpp verwenden. MPC bedient sich nicht intuitiv, aber so geht es:
Stellt eine SSH-Verbindung zu eurem MPD-Server her. Dann tippt ihr mpc help ein, um einen ersten Eindruck über die Funktionen zu bekommen. MPC kann keine Titel aus eurer Musiksammlung direkt abspielen, sondern basiert auf Playlisten. Den Inhalt der aktuellen Playlist seht ihr mit:
mpc playlist
Sarah Brightman - A Whiter Shade Of Pale
Procol Harum - A Whiter Shade Of Pale
Es kann sein, dass die Liste bei euch leer ist. Mit mpc clear löscht ihr diese Liste. Alle Stücke eines Interpreten sucht ihr mit mpc search artist abba und einen Titel mit mpc search title "waterloo". Wenn ihr das Gesuchte gefunden habt, kann man es mit mpc add "abba/greatest hits/dance_mix_-_Abba_Medley.ogg" der Playliste hinzufügen. Dabei muss der volle Pfad des Titels verwendet werden. Den kopiert ihr mit Vorteil aus den Ergebnissen von mpc search. Ihr könnt beliebig viele Stücke der Playlist hinzufügen. Dann wird die Liste mit mpc play oder mpc play 1 wiedergegeben, wobei die Zahl für die Titel-Nummer in der Liste steht. Die Wiedergabe wird mit mpc stop unterbrochen. Alle anderen Möglichkeiten könnt ihr euch selbst aus mpc help erarbeiten.
Jetzt wird es spannender
Ihr kennt doch YouPlay und den Artikel Musik im Terminal. Zwar habe ich YouPlay auf meinem Raspi4 gestern Abend nicht zum Laufen gebracht, aber das Suchen und Streamen aus dem Terminal funktioniert auch auf dem Raspberry Pi. Das geht aber etwas anders als bei einer aktuellen Client-Distribution.
Ich lasse die Katze gleich aus dem Sack:
mpv --no-video --audio-device='alsa/sysdefault:CARD=DAC' --ytdl-format=bestaudio ytdl://ytsearch:"musik_titel"
Damit das funktioniert, sind ein paar Vorarbeiten notwendig. Als Server verwende ich einen Raspberry Pi 4 mit einem auf Debian Bullseye upgegradetem Raspberry OS. Siehe dazu auch: Raspberry Pi OS von Buster auf Bullseye upgraden. Falls ihr noch auf Buster seid und euer MPD-Server gut läuft, könnt ihr das Dist-Upgrade wagen, solltet aber mit einem kaputten Desktop rechnen.
Erster Schritt: yt-dlp installieren. Mit den normalen Verfahren (apt oder pip) funktioniert das auf dem Raspi nicht. Es geht so:
sudo wget -qO /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
yt-dlp --version
sudo yt-dlp -U
Ob yt-dlp nun läuft, könnt ihr so ausprobieren: yt-dlp -g ytsearch1:'a whiter shade of pale'. Falls ihr jetzt zwei sehr lange URLs seht, ist alles in Ordnung.
Dann solltet ihr testen, ob mpv installiert ist. Gebt einmal mpv irgendeine_lokale_test_mp3_Datei.mp3 ein und schaut, ob mpv läuft und die Musik auf den am Raspi angeschlossenen Lautsprechern wiedergegeben wird. Falls mpv nicht installiert ist, holt ihr das mit sudo apt install mpv nach. Jetzt kann es sein, dass mpv in Ordnung ist, aber keine Musik ertönt. Das liegt dann am falschen Output-Device.
Der Befehl mpv --audio-device=help zeigt eure Ausgabegeräte an, z.B.:
mpv --audio-device=help
List of detected audio devices:
'auto' (Autoselect device)
'alsa' (Default (alsa))
'alsa/lavrate' (Rate Converter Plugin Using Libav/FFmpeg Library)
'alsa/samplerate' (Rate Converter Plugin Using Samplerate Library)
'alsa/speexrate' (Rate Converter Plugin Using Speex Resampler)
'alsa/jack' (JACK Audio Connection Kit)
'alsa/oss' (Open Sound System)
'alsa/upmix' (Plugin for channel upmix (4,6,8))
'alsa/vdownmix' (Plugin for channel downmix (stereo) with a simple spacialization)
'alsa/output' (output)
'alsa/plughw:CARD=b1,DEV=0' (bcm2835 HDMI 1, bcm2835 HDMI 1/Hardware device with all software conversions)
'alsa/sysdefault:CARD=b1' (bcm2835 HDMI 1, bcm2835 HDMI 1/Default Audio Device)
'alsa/dmix:CARD=b1,DEV=0' (bcm2835 HDMI 1, bcm2835 HDMI 1/Direct sample mixing device)
... usw.
Ein anderes hilfreiches Kommando zur Ermittlung der Audio-Devices ist:
aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: b1 [bcm2835 HDMI 1], Gerät 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
Sub-Geräte: 4/4
Sub-Gerät #0: subdevice #0
Sub-Gerät #1: subdevice #1
Sub-Gerät #2: subdevice #2
Sub-Gerät #3: subdevice #3
Karte 1: Headphones [bcm2835 Headphones], Gerät 0: bcm2835 Headphones [bcm2835 Headphones]
Sub-Geräte: 4/4
Sub-Gerät #0: subdevice #0
Sub-Gerät #1: subdevice #1
Sub-Gerät #2: subdevice #2
Sub-Gerät #3: subdevice #3
Karte 2: DAC [USB AUDIO DAC], Gerät 0: USB Audio [USB Audio]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Mit diesen Informationen solltet ihr in der Lage sein, das richtige Gerät für mpv auszuwählen. In meinem Fall war es:
mpv --no-video --audio-device='alsa/sysdefault:CARD=DAC' beispiel.mp3
Testet es mit mpv --no-video --audio-device='hier steht euer Gerät' so, wie es von mpv --audio-device=help ausgegeben wird. Das war es; probiert nun diesen Befehl aus:
mpv --no-video --audio-device="dein_audio_gerät" --ytdl-format=bestaudio ytdl://ytsearch:"musik_titel"
Wer es bequemer haben möchte, trägt diese Zeile in die .bashrc auf dem Raspi ein:
alias play='_y(){ mpv --ytdl-format=bestaudio --audio-device="dein_audio_gerät" ytdl://ytsearch:"$*";}; _y'
Nach einem Neustart des Terminals kann beliebige Musik mit play "song_title" abgespielt werden.
Es kann nur besser werden
Aufmerksame GNU/Linux.ch Leser:innen könnten nun auf die Idee kommen, YouPlay auf dem Server zu verwenden. In diesem Artikel werde ich nicht mehr darauf eingehen, aber es sollte schon möglich sein, weil YouPlay auch nichts anderes macht, als oben beschrieben wurde. Das ist weniger eine Programmier-Herausforderung, sondern eher eine Frage der Konfiguration und Dokumentation. In einem späteren Artikel kümmere ich mich darum; stay tuned.
Ich nutze Raspberry Pis in der ganzen Wohnung als Multiroom System. Dazu habe ich sie jeweils mit einem DAC und aktiven Lautsprechern verknüpft.
Ich habe verschiedene Dinge probiert:
Am Ende bin ich beim Logitech Media Server gelandet auf einem Pi und Squeezelite auf jedem Pi als Empfänger. Läuft hervorragend und lässt keine Wünsche offen. Neben der Bibliothek auf meinem NAS habe ich Zugriff auf Radio, Podcasts und Deezer. Es gibt viele Plugins, so kann man die Player auch über AirPlay oder Upnp ansprechen. Zudem gibt es native Apps für alle Plattformen, wobei ich überall die WebGUI nutze. HiRes-Audio wird auch problemlos abgespielt und es lassen sich beliebige Wecker stellen.
Empfehlenswerte Plugins:
Danke für deine Empfehlung. Ist für viele bestimmt bequemer als mein Terminal-Gebastel :)
Ich möchte auf das Multi-Room-Sound-Projekt Balena Sound hinweisen. Ich habe es noch nicht benutzt, aber es klingt wie deine Lösung: https://hub.balena.io/organizations/balenalabs/fleets/balenaSound
Ich kann mich da Michael nur anschließen. Bin auch von MPD zu LMS (Squeezebox Server) gewechselt. Läuft bei mir in einem Docker Container auf einem RPi3. Und das alles sehr stabil.
Kann ich Youplay auch als Client nutzen? (also ohne Terminal)
heisst: starten einen yt-streams auf dem Musik-Server per Youplay (auf meinem Linux-Desktop), der Output geht direkt an die angeschlossenen Lautsprecher des Musik-Servers (im Wohnzimmer)?
Wäre vom Prinzip ja wie "chromecast" oder?
gotubecast ;)