Ein Programm zur Steuerung der Mediawiedergabe auf einem Raspberry Pi.

Programme zur Mediawiedergabe für den Raspberry Pi werden häufig über ihre eigene Bedienoberfläche auf dem Pi selbst gesteuert. Das erfordert zusätzliche Geräte wie z.B. Bildschirm oder Tastatur. Für einen Media-Zuspieler ist das keine optimale Konfiguration, weshalb für manche Media-Software Zusätze nachrüstbar sind, die eine Steuerung von anderen Geräten aus erlauben.

Teils muss für eine solche Fernbedienung der Fernseher laufen, damit die Bedienoberfläche des Media-Zuspielers dargestellt werden kann. Teils gelingt die Fernbedienung im Browser oder einer App des als Fernbedienung verwendeten Gerätes, oft z.B. ein Handy. Bei näherem Hinsehen lassen viele dieser Angebote aber zu wünschen übrig.

Calypso geht einen anderen Weg und stattet einen Raspberry Pi lediglich mit einer schlanken Möglichkeit aus, die Mediawiedergabe mit HTTP-Signalen zu steuern. Eine eigene Bedienoberfläche und Geräte wie Maus oder Tastatur sind nicht nötig. Mit Calypso ausgestattet wird das kleine Kästchen einfach neben Fernseher oder Stereoanlage gestellt und schon kann aus jedem Browser heraus die Wiedergabe gesteuert werden.

Vorbereitung

Zur Ausführung von Calypso ist ein Raspberry Pi mit Java und dem Programm mpv [1] erforderlich. Die folgenden Schritte schaffen die nötigen Voraussetzungen.

  1. Den Raspberry Pi in Betrieb nehmen [7], falls noch nicht geschehen

  2. Mit dem Befehl mpv --version überprüfen, ob mpv installiert ist

  3. mpv [1] und socat [2] installieren, falls mpv noch nicht vorhanden ist
    sudo apt-get install mpv socat

  4. Mit dem Befehl java -version überprüfen, ob Java installiert ist

  5. Das JDK-Paket [3] installieren, falls Java noch nicht vorhanden ist
    sudo apt-get install openjdk-11-jdk

Nun ist der Raspberry Pi bereit zur Installation von Calypso wie im nächsten Kapitel beschrieben.

Anmerkung

Kommandos, die während dem Abspielen gegeben werden, erhält mpv über sogenannte Unix Domain Sockets. Solche Signale werden erst ab Java 16 unterstützt, was als 64-Bit ARM Version für den Raspberry Pi noch nicht erhältlich ist. Bis auf weiteres ist deshalb dafür eine Form implementiert, die das Werkzeug socat [2] zusätzlich erfordert.

Installation

Mit Abschluss der Vorbereitung sind folgende Schritte zur Installation von Calypso nötig.

  1. Die Datei calypso.zip herunterladen

  2. Die Datei calypso.zip an einen Ort der Wahl entpacken, z.B. nach /home/pi/prg/calypso

Nun ist Calypso bereit zum Start wie im nächsten Kapitel beschrieben.

Damit Calypso bereits läuft, wenn der Raspberry Pi gestartet wurde, kann das Programm als Dienst eingerichtet werden.

Start

Calypso wird als Programm gestartet, das auf HTTP-Steuerbefehle lauscht und diese ausführt. Der Aufruf geschieht wie folgt.

Calypso zum Abspielen von HTTP-Inhalten aufrufen
java -jar calypso.jar conf=conf/calypso.properties

Mit dem obigen Aufruf werden URLs als Parameter zur Angabe des abzuspielenden Titels erwartet und an den mpv Player durchgereicht. Diese werden dann über HTTP-Streaming abgespielt.

Konfiguration der Protokollierung

Die Aktivitäten Calypsos können protokolliert und mit einer Konfigurationsdatei eingestellt werden, deren Name und Ablageort über den Parameter java.util.logging.config.file benannt wird. Der Parameter zur Protokollierung wird beim Start Calypsos wie folgt übergeben.

Startbefehl für Calypso mit Java-Parametern
java -Djava.util.logging.config.file=conf/logging.properties -jar calypso.jar  conf=conf/calypso.properties &

Startparameter

Beim Start von Calypso werden Parameter aus der Datei gelesen, die mit dem Parameter conf bezeichnet ist. Im Verzeichnis conf des Ordners, in dem Calypso installiert wurde, liegt zu diesem Zweck die Datei calypso.properties. Darin kann z.B. der Port geändert werden, auf dem Calypso läuft.

Start überprüfen

Über den folgenden URL kann überprüft werden, ob Calypso läuft (Annahme: Der Raspberry Pi hat den Namen rpi4).

http://rpi4:9090/calypso/ping

Wird die Antwort ping zurückgegben, läuft Calypso.

Beenden

Calypso kann einfach beendet werden, indem mit Strg-C der laufende Prozess beendet wird. Ferner lässt sich Calypso auch per HTTP wie folgt beenden.

http://rpi4:9090/calypso/server/stop

Calypso bedienen

Die Bedienung von Calypso funktioniert am besten mit dem Programm Tango [4], das speziell für die Zusammenarbeit mit Calypso ausgelegt ist. Das folgende Schaubild zeigt deren Zusammenspiel.

tango calypso
Abb. 1. Tango und Calypso im Zusammenspiel

Programmschnittstelle

Calypso fungiert als Vermittler zwischen einem Mediaserver und einem Programm zum Abspielen von Video und Audio. Auf diese Weise entsteht eine generische Schnittstelle, hinter der beliebige Mechanismen zum Abspielen etabliert werden können. Die Steuerung von Abspielprozessen kann so über dieselben einfachen HTTP-Kommandos erfolgen, unabhängig davon, wie das Abspielen von Media-Inhalten letztlich erfolgt.

calypso schnittstelle
Abb. 2. die Media-Architektur um Calypso

HTTP-Kommandos

Die nachfolgend beschriebenen HTTP-Kommandos bilden die generische Schnittstelle, mit der beliebige Abspieler gesteuert werden können.

HTTP GET /calypso/play?titel=[url]
HTTP GET /calypso/play?titel=[url]&r=[url]
HTTP GET /calypso/pause
HTTP GET /calypso/seek?pos=[sek|-sek]
HTTP GET /calypso/stop
HTTP GET /calypso/ping
HTTP GET /calypso/server/stop

Die oben beschriebene HTTP-Schnittstelle wird von Calypso für einen konkreten Abspieler implementiert, im Augenblick ist dies der Abspieler mpv [1].

mpv-Kommandos

Hier sind die Kommandos beschrieben, die in Reaktion auf die HTTP-Kommandos von Calypso an mpv gesendet werden. Die Kommunikation zwischen Calypso und mpv erfolgt teils über die Kommandozeile und teils auf anderem Weg.

Befehle über die Kommandozeile

Die folgenden Kommandos erfolgen als Befehl auf der Kommandozeile.

Abspielen (Video)
mpv --input-ipc-server=/tmp/mpvsocket --no-terminal http://server:port/pfad/zum/titel.mp4
Abspielen (Musik)
mpv --input-ipc-server=/tmp/mpvsocket --no-terminal --vo=null http://server:port/pfad/zum/titel.mp3

Manche Musikdateien enthalten das Bild des Albums in ihren Metadaten, was mpv dazu veranlasst, die Datei als Video abzuspielen. Das führt für Musikdateien zu einem Fehler und zum Abbruch des Programms. Deshalb wird für Musikdateien die Option --vo=null verwendet, um mpv zu siganlisieren, dass keine Videoausgabe erfolgen soll.

Die Unterscheidung zwischen Musik und Video erfolgt in Calypso anhand der Dateiendung. Es ist vorerst nur mp3 hart kodiert.

Befehle an den Java-Prozess

Der mpv-Player kennt verschiedene Befehle zum Beenden eines gerade laufenden Abspielprozesses. Im Test konnte noch nicht erreicht werden, dass der Abspielprozess damit komplett endet. Stattdessen stoppt die Wiedergabe und der Abspielprozess bleibt hängen. Deshalb wird zum Stoppen eines laufenden Abspielprozesses dessen Java-Prozess hart beendet.

Stopp
Process p = App.getPlayerProcess();
p.destroy();

Befehle über Sockets

Die folgenden Kommandos erfolgen als Shell Skript auf der Kommandozeile über socat an /tmp/mpvsocket, solange Java 16 noch nicht erhältlich ist. Sobald Java 16 für den Raspberr Pi verfügbar ist, wird der Befehl über Unix Domain Socket direkt an /tmp/mpvsocket übermittelt werden.

Die Shell Skripte werden in dem Ordner erwartet, der beim Start von Calypso im Parameter conf angegeben ist, z.B. /home/pi/prg/calypso.

Pause

Skript: pause, Kommando:

echo '{"command": ["cycle", "pause"]}' | socat - /tmp/mpvsocket
Seek

Skript-Aufruf: seek [sek | -sek], Kommando:

echo '{"command": ["seek", '30']}' | socat - /tmp/mpvsocket

Bei seek wird der Parameter mit der Anzahl Sekunden als Parameter an das Shell Skript weitergereicht, bspw. seek 30 oder seek -45. Deshalb wird im Shell Skript der mpv-Befehl zu

echo '{"command": ["seek", '$1']}' | socat - /tmp/mpvsocket

Für einen Sprung rückwärts wird die Anzahl Sekunden mit negativem Vorzeichen übergeben, ansonsten erfolgt der Sprung vorwärts. Sprünge über seek erfolgen ab der aktuellen Abspielposition.

Rückmeldung

Beim Start eines Abspielvorgangs kommt noch die Besonderheit hinzu, dass für den zum Abspielen gestarteten Player-Prozess ein Überwachungs-Thread erzeugt wird, der feststellt, wann der Abspielprozess endet und eine Rückmeldung sendet.

Diese Funktion wird über den Parameter r im URL für das Abspielen eines Titels gesteuert. Ist der Parameter enthalten, wird der im Parameter angegebene URL aufgerufen.

Beispiel: HTTP GET an

http://raspi:9090/calypso/play?titel=http://server:port/pfad/zum/titel.mp3&r=http://server:port/abspielen/beendet/titelkennung

Mit dem obigen Kommando wird der Titel http://server:port/pfad/zum/titel.mp3 abgespielt. Ist der Titel zuende abgespielt oder wird das Abspielen beendet, ruft Calypso den URL http://server:port/abspielen/beendet/titelkennung auf.

Dienst einrichten

Zur Einrichtung von Calypso als Dienst wird auf dem Raspberry Pi wird eine Datei namens calypso.service mit folgendem Inhalt erstellt. Die Angaben unter ExecStart und WorkingDirectory müssen dabei auf den Ablageort von Calypso verweisen.

[Unit]
Description=Calypso
After=network.target syslog.target

[Service]
ExecStart=/home/pi/prg/calypso/start
WorkingDirectory=/home/pi/prg/calypso
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
Type=forking

[Install]
WantedBy=multi-user.target

Die Datei wie folgt ins Verzeichnis /etc/systemd/system kopieren.

sudo cp calypso.service /etc/systemd/system/calypso.service

Zum Starten dient der folgende Befehl.

sudo systemctl start calypso.service

Der folgende Befehl stoppt den Dienst.

sudo systemctl stop calypso.service

Wenn das Starten und Stoppen verläuft wie vorgesehen, kann der Dienst wie folgt aktiviert werden.

sudo systemctl enable calypso.service

Damit wird Calypso stets gestartet wenn der Raspberry Pi eingeschaltet wird.

Name Calypso

Der Name Calypso lag als Bezeichnung einer Musikrichtung und eines Tanzes [5] für einen Abspieler von Musik nahe, wie es auch schon mit dem Namen für die zu Calypso passende Mediazentrale Tango gemacht wurde.

Calypso wurde wegen der Eigenschaft als Satellitenprogramm von Tango aber auch so genannt, weil einer der Monde des Planeten Saturn [6] so heißt.

Versionshistorie

Version 1

  • 25. April 2021: Initiale Fassung

Version 2

  • 22. Dezember 2021: Voraussetzungen und Installation präzisiert.

Version 3

  • 30. Dezember 2022: Umgestellt auf VLC

Version 4

Version vom 8. Januar 2023.

  • Umgestellt auf mpc

  • Infos zur Programmschnittstelle hinzugefügt

Verweise