
Abbildung 2: Nach erfolgter Installation und dem Start von Apache sehen Sie im Browser die Startseite des Webservers.
Falls nicht, starten Sie Apache mit dem Befehl sudo /etc/init.d/apache2 restart neu. Jetzt können Sie damit beginnen, den von der Kamera erzeugten Stream via Rpicam-vid zum Mediaserver zu senden. Das erfordert jedoch ein Umformatieren der Daten. Das umfangreiche Kommando dazu zeigt Listing 2. Den Stream aus der Kamera passen Sie mithilfe von Rpicam-vid so an, wie es für die aktuellen Umgebungsgegebenheiten passt. Die meisten Parameter erklären sich selbst, Sie können sie entsprechend Ihrem Projekt anpassen.
Der Stream wandert als Nächstes via Pipe in das Tool Ffmpeg weiter. In diesem Fall kümmert es sich darum, den Stream in RTSP umzuwandeln und an den Mediaserver zu senden. Falls Sie den Server nicht zusammen mit der Kamera auf demselben System betreiben, geben Sie hier die URL des Mediaservers an.
Um zu überprüfen, ob Sie den Stream vom Mediaserver abrufen können, verwenden Sie das Ffplay-Kommando aus den letzten beiden Zeilen von Listing 2. Hier müssen Sie gegebenenfalls die URL an Ihre Gegebenheiten anpassen.
Listing 2
Kamera-Stream an den Mediaserver senden
$ rpicam-vid \ --inline 1 --brightness 0.2 --contrast 1.1 \ --sharpness 1.0 --level 4.1 --framerate 60 \ --width 640 --height 360 -t 0 -n \ --codec libav --libav-format mpegts \ --libav-video-codec h264_v4l2m2m -o - | \ ffmpeg -fflags +nobuffer+igndts+discardcorrupt \ -flags low_delay -hwaccel drm \ -hwaccel_output_format drm_prime -hide_banner \ -r 60 -i - -c:v h264_v4l2m2m -b:v 2000k -r 30 \ -threads 0 -f rtsp -rtsp_transport udp \ rtsp://localhost:8554/stream/1 &> /dev/null $ ffplay rtsp://localhost:8554/stream/1 \ -fflags nobuffer -flags low_delay -framedrop
Ziel dieses Projekts ist es aber, den Stream an eine Webseite zu senden. Hier gilt es, einige Dinge zu beachten, damit die Datenübertragung wie gewünscht klappt. Zuerst einmal sollten Web- und Mediaserver auf demselben Rechner laufen. Wenn Sie den Stream auf einer Webseite verwenden möchten, eignet sich RTSP nicht als Protokoll; verwenden Sie stattdessen WebRTC über HTTP.
Um keinen zusätzlichen Javascript-Player einbauen zu müssen, arbeiten Sie mit einem IFrame, in den Sie den Stream einbinden (Listing 3). Auf diese Weise lassen sich bei Bedarf mehrere Streams auf einer HTML-Seite unterbringen. Für einen ersten Test legen Sie mit Root-Rechten im Verzeichnis /var/www/html/ die Datei stream.html mit dem IFrame an und rufen sie dann im Webbrowser auf.
Listing 3
stream.html
<iframe src="http://RasPi-IP/URL:8889/stream/1" width="800px" height="600px"/>
Wenn Sie für Ihre Zwecke eine fest montierte Kamera benötigen, ist das Projekt an dieser Stelle für Sie abgeschlossen. Das Steuern der Kamera über den Browser erfordert jedoch einige zusätzliche Schritte.
Bewegung!
Um die Kamera zu bewegen, verwenden wir einige 3D-gedruckte Teile und zwei handelsübliche Servomotoren [5]. Die für den Druck benötigten STL-Dateien finden Sie auf Thingiverse [6]. Als Gehäuse für den Raspberry Pi eignet sich die U-Maker Box von Weidmüller [7] besonders gut, da sie sich flexibel anpassen lässt.
Zum Ansteuern der Servos dient die Bibliothek Pigpio [8], die bereits Bestandteil der Distribution ist. Sie umfasst einen Daemon und unterschiedliche Clients. Es genügt, den Daemon zu starten. Die Tabelle “Kommandos für den Pigpio-Daemon” zeigt alle Befehle, die Sie dafür benötigen. Da es hier um dynamischen Content geht, ist das Web-Framework Flask [9] das Mittel der Wahl. Für das Projekt erstellen Sie ein eigenes, virtuelles Python-Environment. In Listing 4 finden Sie alle notwendigen Kommandos, um die entsprechende Software zu installieren.
|
Kommando |
Beschreibung |
|---|---|
|
|
Autostart aktivieren |
|
|
Autostart deaktivieren |
|
|
Start |
|
|
Stopp |
|
|
Statusanzeige |
Listing 4
Virtuelles Environment vorbereiten
$ python -m venv httpserver $ cd httpserver/ $ source ./bin/activate $ pip install Flask $ pip install pigpio $ sudo systemctl start pigpiod
Die zwei Servomotoren schließen Sie mit ihrer Betriebsspannung an die GPIO-Pins 5V und GND an, die Signaleingänge der Motoren gehören an GPIO17 und GPIO18 (Abbildung 3). Die Wago-Klemmen passen exakt in die Aussparungen im Gehäuse, die orangefarbenen Halterungen gewährleisten eine saubere Leitungsführung. Sorgen Sie beim Einbau der Servos dafür, dass sie sich in Mittelstellung befinden.
Wie erwähnt, besteht die Bibliothek Pigpio aus einem Daemon und einem Client, die über den Port 8888 miteinander kommunizieren. Den belegt allerdings bereits MediaMTX für das HLS-Protokoll. Um diesen Konflikt aufzulösen, editieren Sie die Datei mediamtx.yml im Stammverzeichnis des Servers. Suchen Sie darin nach dem Eintrag hls: und setzen Sie ihn auf no. Der Server verwendet diesen Port nach einem Neustart nicht mehr. Gegebenenfalls müssen Sie zusätzlich den Pigpio-Daemon via sudo systemctl start pigpiodneu starten.
Nach dem Einrichten der virtuellen Umgebung geht es ans Programmieren des Servers. Flask ist ein sehr mächtiges Framework, das Ihnen dabei eine Menge Arbeit abnimmt. Es genügt, die Pfade für die Endpunkte zu definieren und den dazugehörigen Code zu schreiben. Listing 5 zeigt, wie Sie einen Servomotor ansteuern. Um die Bewegung auszulösen, versendet das Skript einfache Ajax-Requests. Das Programm dient lediglich als Einstieg in eine eigene Implementierung.






