Ein Programm zur Steuerung der Mediawiedergabe auf einem Raspberry Pi.

1. Einleitung

Programme zur Mediawiedergabe werden häufig über ihre eigene Bedienoberfläche auf dem Gerät gesteuert, auf dem sie installiert sind. 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 auf dem Browser oder in einer eigens zu installierenden App des als Fernbedienung verwendeten Gerätes. 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.

2. Installation

Der Raspberry Pi sollte mit einem USB-Stick [3] ausgestattet werden, um die SD-Karte mit dem Betriebssystem von Schreibvorgängen zu entlasten. Desweiteren sind die Pakete Java und OMXPlayer Voraussetzung, deren Vorhandensein kann mit omxplayer -version und java -version überprüft werden.

Folgende Schritte sind zur Installation nötig.

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

  2. Einen USB-Stick [3] am Raspberry Pi anbringen

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

  4. Das OMXPlayer-Paket [1] installieren, falls es noch nicht vorhanden ist
    sudo apt-get install omxplayer

  5. Die Datei calypso.zip herunterladen

  6. 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.

3. 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 port=9090 player=omx ctx=/calypso

Mit dem obigen Aufruf werden URLs als Parameter zur Angabe des abzuspielenden Titels erwartet und an den OMXPlayer durchgereicht. Diese werden dann über HTTP-Streaming abgespielt. Mit der Angabe player=omx wird der OMXPlayer zum Abspielen verwendet, ein Programm, das die Hardwareunterstützung des Raspberry Pi beim Abspielen von Videos nutzt.

Der zusätzliche Parameter nfs-prefix erlaubt zudem Inhalte wiederzugeben, die über NFS für den Raspberry Pi erreichbar sind. In diesem Fall werden abzuspielende Titel als relative Pfadangabe übergeben und mit dem Präfix laut Parameter nfs-prefix kombiniert. Für diese Betriebsart lautet der Aufruf wie folgt.

Calypso zum Abspielen von NFS-Inhalten aufrufen
java -jar calypso.jar port=9090 nfs-prefix="/media/mc" player=omx ctx=/calypso

Mit den obigen Aufrufen ist Calypso über den in port angegebenen Port per HTTP steuerbar. Zwei weitere Funktionen beeinflussen die Protokollierung wie folgt.

Ablageort für das Abspielprotokoll

Während der Mediawiedergabe kann ein Protokoll erzeugt werden, das im Falle von Unterbrechungen zur Bestimmung der Stelle zum Weiterspielen dienen kann. Da das Mitschreiben des Protokolls vergleichsweise umfangreiche Schreibvorgänge erfordert, sollte die Ausgabe auf ein zusätzlich dafür angebrachtes Speichermedium und nicht auf die SD-Karte des Raspberry Pi geschehen. Der Parameter omx.wd dient in diesem Fall zur Angabe des Ablageortes.

Konfiguration der Protokollierung

Zusätzlich zur Protokollierung der Mediawiedergabe können auch die Aktivitäten Calypsos protokolliert und mit einer Konfigurationsdatei eingestellt werden, deren Name und Ablageort über den Parameter java.util.logging.config.file benannt wird.

Die Parameter zur Protokollierung werden beim Start Calypsos wie folgt übergeben.

Startbefehl für Calypso mit Java-Parametern
java -Domx.wd=/mnt/store/calypso -Djava.util.logging.config.file=logging.properties -jar calypso.jar port=9090 player=omx ctx=/calypso &

In der Datei logging.properties ist die Pfadangabe für den FileHandler auf /mnt/store/calypso voreingestellt. Die Angabe kann an den gewünschten Ablageort für das Ausführungsprotokoll angepasst werden.

3.1. 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.

4. 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

5. 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

Nachfolgend zudem einige Programmbefehle, wie sie auch in Tango eingebaut und zur Verwendung von Calypso direkt oder zum Einbau in Drittprogramme geeignet sind. Eine vollständige API-Dokumentation ist noch in Arbeit.

5.1. Abspielen

Zum Abspielen eines Titels wird ein HTTP GET Aufruf an einen Uniform Resource Locator (URL) wie in folgendem Beispiel abgegeben.

Abspielen eines Titels
http://rpi4:9090/calypso/play?&th=1&ti=10&o=local&log=true&titel=http://example.com:9090/srv/Filme/S/sound_city.m4v

Auf Wunsch gibt Calypso eine Rückmeldung, wenn das Abspielen des Titels beendet ist.

Abspielen eines Titels mit Rückmeldung
http://rpi4-wz:9090/calypso/play?&th=1&ti=240&o=local&log=true&titel=http://example.com:9090/srv/Filme/S/sound_city.m4v&r=http://mein-server:8080/mc/abspielenBeendet/11/3

5.1.1. Parameter

th

aus der OMXPlayer-Doku: (threshold) Amount of buffered data required to finish buffering [s]

ti

aus der OMXPlayer-Doku: (timeout) Timeout for stalled file/network operations (default 10s)

o

Audio-Ausgabe (local | hdmi | none) Wenn zusätzlich zum Fernseher auch ein Audiogerät (Stereo-Anlage, Verstärker ö.ä.) angeschlossen und dieses über den analogen Ausgang verbunden ist, kann mit Angabe von o=local der Fernseher ausgeschaltet bleiben, wenn nur Musik gehört wird.

log

Log-Ausgabe (true | false) Die Log-Ausgabe muss eingeschaltet sein (log=true), damit das Weiterspielen von der letzten Unterbrechung aus gelingt.

titel

URL des Titels, der abgespielt werden soll

r

URL für Rückmeldung (optional)

5.2. Weiterspielen

Wird ein Abspielvorgang durch Betätigen der Stopp-Taste unterbrochen oder bricht ein Abspielvorgang unerwartet ab, kann mit der Funktion Weiterspielen das Abspielen an der Position fortgesetzt werden, an der der Abbruch erfolgte. Der Aufruf zum Weiterspielen lautet wie folgt.

http://rpi4:9090/calypso/playon?&th=1&ti=240&o=local&log=true&titel=http://example.com:9090/srv/Filme/S/sound_city.m4v

Die Funktion zum Weiterspielen funktioniert nur für den zuletzt gespielten Titel und verwendet das Abspielprotokoll. Das Abspielprotokoll muss daher eingeschaltet sein, damit das Weiterspielen funktioniert.

6. USB-Stick anschließen

Die folgenden Schritte etablieren das Verzeichnis /mnt/store auf einem USB-Stick und hängen diesen dauerhaft ins Dateisystem.

  • sudo blkid liefert die UUID des USB-Sticks

  • dann sudo nano /etc/fstab

Eintrag in /etc/fstab des Raspberry Pi
UUID=b40e99c3-9798-4589-bcf8-f29b17b28a4d /mnt/store ext4 rw,suid,dev,exec,auto,async,relatime,users,nofail,x-systemd.device-timeout=5 0 0
Kommandos zum Anlegen der Ordner nebst Rechten
sudo mkdir /mnt/store
sudo mkdir /mnt/store/calypso
sudo chown -R pi:pi /mnt/store
sudo chmod -R ug+rwx /mnt/store

Damit ist der USB-Stick dauerhaft am Raspberry Pi eingerichtet und wird bei jedem Neustart entsprechend verwendet.

7. 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.

8. Verweise