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.
-
Den Raspberry Pi in Betrieb nehmen [7], falls noch nicht geschehen
-
Mit dem Befehl
mpv --version
überprüfen, obmpv
installiert ist -
mpv
[1] undsocat
[2] installieren, fallsmpv
noch nicht vorhanden ist
sudo apt-get install mpv socat
-
Mit dem Befehl
java -version
überprüfen, ob Java installiert ist -
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 Werkzeugsocat
[2] zusätzlich erfordert.
Installation
Mit Abschluss der Vorbereitung sind folgende Schritte zur Installation von Calypso nötig.
-
Die Datei
calypso.zip
herunterladen -
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.
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.
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.
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.
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.
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.