Für den Scheckkarten-PC gibt es eine passende Kamera, die der Besitzer direkt an einen eigenen Connector anschließt und die Bilddaten mit sehr wenig Overhead liefert. Dieser Test zeigt, wo es hakt und wie ein paar Linux-Befehle und -Pipes so manches Problem lösen.
Raspberry Pi HD Video Camera
Auflösung Foto: 5 Megapixel (2592 x 1944)
Auflösung Video: 1080 p mit bis zu 30 Fps, bei 720 p 60 Fps, bei VGA sogar 90 Fps
Objektiv: Blende 2,9, Brennweite 3,6 mm (entspricht 36 mm Weitwinkel einer DSLR)
Preis: ca. 30 Euro inkl. MwSt
Heimserver, Multimedia, Steueranlage für die Home-Automation oder als Sensorzentrale fürs Schiff – der Raspberry Pi macht in vielen Szenarien eine gute Figur, das zeigte zuletzt der Schwerpunkt im vorigen Linux-Magazin. Auch die kostengünstige Video-Überwachung liegt im Trend, doch sind die meisten erhältlichen Kameras keine gute Empfehlung: Ein Kollege des Autors hat vor wenigen Wochen in einem Blogpost beschrieben, welche haarsträubenden Sicherheitslücken die typischerweise Linux-basierten Web- und Netcams mitbringen [1].
Nach solcher Lektüre sieht sich der Linux-Admin lieber nach Alternativen um und landet zwangsläufig beim Raspberry Pi mit dem Addon Picam [2].
Die Hardware
Das benötigte Set kostet nicht die Welt, Abbildung 1 zeigt die im Folgenden verwendeten Komponenten: Wer die Kamera auch an Orten nutzen will, wo kein Ethernet-Kabel liegt, braucht ein Wifi-Dongle, dazu ein Gehäuse. Das Beispielpaket bei RS Electronics [2] kostete 85 Euro, eine Speicherkarte ließe sich sicherlich auch anderweitig günstiger besorgen. Doch die mit mehreren Recovery-Images bespielte SD-Karte erspart für den geringen Mehrpreis durchaus Arbeit.
Die Webseite des Raspberry-Projekts hat der Kamera eine extra Seite mit Anleitungen gewidmet [3]. Dort dokumentiert auch ein Video die Schritte zur Installation der Kamera. Neben dem Ethernet-Port (Abbildung 2) befindet sich der Konnektor für die Kamera.
Wer an dieser Stelle noch nie etwas angeschlossen hat, den überrascht der Halter, der im Port steckt. Den muss der stolze Besitzer von Pi und Picam zunächst anheben, damit er das Flachbandkabel einstecken kann. Dessen blaue Seite muss zum Ethernet-Connector zeigen, anschließend drückt er den Halter wieder herunter – fertig ist der Einbau. Die meisten WLAN-Dongles erkennt der Pi automatisch, im Test handelt es sich um einen USB-Stick von Edimax.
Einlochen
Das Flachbandkabel verbindet die Kamera mit dem Pi-Board, ist ungefähr 15 Zentimeter lang und biegsam, sollte aber nicht geknickt werden. Die Platine des Kameramoduls selbst misst knapp 2Quadratzentimeter, der optische Sensor 0,5 Quadratzentimeter und ist etwa 3 Millimeter hoch.
Im Prinzip ist es möglich, ein Loch in den Deckel der meisten erhältlichen Gehäuse zu schneiden, durch den der Kamerasensor freie Sicht hat. Dann kann der Bastler die Platine von oben her festschrauben, muss aber viel Sorgfalt walten lassen, vor allem beim Falten des Kabels. Er sollte sich bereits vorher überlegen, wo die Kamera zum Einsatz kommen soll, oder gleich ein zur Picam passendes Gehäuse bestellen.
Bevor er die Kamera verwenden kann, muss der Besitzer sie aktivieren. Dafür benutzt er als Administrator auf dem Pi am besten »raspi-config« . Läuft der Mini-PC mit der neuesten Software-Release, ist der fünfte Menupunkt »Enable Camera« (Abbildung 3) zuständig. Ein Reboot macht die Änderung wirksam.
In der im Beispiel verwendeten Raspian-Distribution befinden sich zwei Binaries, für die Interaktion mit der Kamera: »raspistill« und »raspivid« . Wie die Namen schon vermuten lassen, dient »raspistill« dem Erzeugen von Bildern und »raspivid« zeichnet Videodaten auf.
Das erste Testfoto schießt »raspistill -o test.jpg« . Das Programm beherrscht viele Optionen. Mit »-w« und »-h« beispielsweise lassen sich Breite und Höhe angeben, die Option »-e Encoding« erlaubt es, PNG, Gif oder Bitmap-Dateien statt der Standard-Jpeg-Bilder zu erzeugen. Auch kann der Benutzer Einfluss auf die Belichtungswerte des Bildes nehmen. Erwähnenswert ist auch die Option »-tl Sekunden« , die für Zeitraffer-Aufnahmen (englisch: Timelapse) alle paar Sekunden ein Bild erstellt.
Das Kommando bietet auch eine Vorschau für die Konsole des Pi: Dabei schreiben Raspivid und Raspistill direkt in den Videospeicher, sodass eine X11-Umgebung nicht notwendig ist. Abbildung 4 zeigt einen Screenshot.
Das Kommando »raspivid« teilt viele Optionen mit »raspistill« , beispielsweise die Auflösung der Aufnahme. Allerdings gibt hier die Option »-t« an, wie viele Millisekunden die Aufnahme lang sein soll, mit 0 weist der Admin den Pi an, endlos aufzunehmen. Der Aufruf »raspivid -t 10000 -o test.h264« erzeugt folglich eine zehnsekündige Video-Aufnahme. Auch hier gibt es eine Reihe von Parametern, die die Aufnahmequalität beeinflussen, sogar Video-Effekte sind möglich.
Das Ausgabeformat ist in der Videoversion allerdings mit einem H.264-Strom bereits festgeschrieben. Mit dem Dateityp-Identifizierer »file« lässt sich die Ausgabedatei als »JVT NAL sequence, H.264 video @ L 40« klassifizieren. Gerade damit kommt der Videoformat-Tausendsasa Ffmpeg prima zurecht, auch Ffplay spielt es problemlos ab, Mplayer nur mit etwas Nachhilfe, Xine versagt, aber VLC funktioniert.
Im Netzwerk
Diese Bilder im Netz bereitzustellen ist relativ einfach. So kann ein Skript in regelmäßigen Abständen Raspistill aufrufen und dabei eindeutige Dateinamen vergeben. Diese landen im Verzeichnis eines Webservers, wobei das Skript noch die hilfreiche Option »-l Linkname« kennt. Listing 1 zeigt, wie der Admin sicherstellt, dass in der Datei »latest.png« immer das neueste Bild hinterlegt ist. Dabei ist allerdings Vorsicht geboten: Die Option »-l« legt überraschenderweise einen Hard-, keinen Softlink an.
Listing 1
Raspistill-Schleife
01 #! /bin/bash 02 03 cd /var/www/htdocs 04 while true 05 do 06 raspistill -o pic-`date +"%d.%m.%Y-%H:%M:%S"`.jpg -l latest.jpg 07 sleep 60 08 done
Auch echte Videostreams sind möglich, hier bieten sich zwei Vorgehensweisen an: Einerseits könnte der Pi die Capture-Daten in eine Datei schreiben oder sie andererseits gleich live übers Netzwerk übertragen. Auf der Picam-Homepage findet sich auch gleich ein Ansatz zur Übertragung mit Netcat und fürs Abspielen mit Mplayer. Das Ganze ist simpel und nutzt klassische Linux-Tools: Auf dem empfangenden Rechner, der das Video darstellen soll, startet der Anwender:
nc -l -p 12345 | mplayer -fps 31 -cache 1024 -
Netcat nimmt so auf Port 12345 Verbindungen entgegen und reicht die Daten an Mplayer durch, der sie mit diesen Parametern brav abspielt. Auf dem Pi mit Kamera startet der Anwender dann das Kommando:
raspivid -t 0 -o - |nc Zielrechner 12345
Fertig ist die Live-Video-Übertragung! Dabei entsteht ein Datenstrom von rund 20 MBit/s bei Full-HD-Videos. Das Bild ist zwar flüssig, kommt aber mit leichter Verzögerung. Bemerkenswert ist, dass laut Top der Raspivid-Prozess gerade mal 8 Prozent der Raspberry-CPU braucht, der Netcat-Prozess dagegen, der die Daten weiterreicht, knapp 50 Prozent.
Wer als Empfänger ebenfalls einen Pi nutzen will, folgt der Empfehlung der Homepage und spielt das Video mit dem Kommando »/opt/vc/src/hello_pi/hello_video/hello_video.bin buffer« ab. In der getesteten Hardwarekonfiguration mit dem Edimax-WLAN-Dongle funktionierte das Streaming in voller Auflösung auch über WLAN mit 802.11n. Doch war auf dem empfangenden Rechner noch eine Umkodierung mittels Ffmpeg nötig (einfach innerhalb der Nc-Empfangs-Pipe), da dort nur VLC installiert war und der Desktop-Client nicht mit dem gestreamten Daten zurechtkam.
Wer jetzt ruckelnde Bilder wegen CPU-oder Bandbreitenproblemen registriert, sollte versuchen, die Video-Auflösung oder die Framerate im Aufruf von Raspivid zu reduzieren.
Motion Detection
Die hohe Kunst der Raumüberwachung ist die vollautomatische Bewegungserkennung (Motion Detection) samt Aktion bei unerwarteter Bewegung (Motion) im überwachten Objekt. Mit den bisher vorgestellten Methoden, also der pauschalen Vollaufzeichnung von Videos oder Fotos, entstehen Unmengen uninteressanter Bilder oder Stunden aussagelosen Videomaterials. Als Kriterium für “interessant” oder überhaupt für Bewegungen innerhalb der Bilder ziehen Überwachungsspezialisten deutliche Änderungen in der beobachteten Szene heran, die in stark divergierenden Bildern resultieren. Bilder oder Videosequenzen, die sich nicht oder nur marginal vom vorherigen Bild unterscheiden, soll die Software sofort löschen.
Bei klassischen Webcams hat der Autor mit der Software Motion [4] gute Erfahrungen gesammelt. Sie basiert auf dem Standard-Linux-Videostack Video4linux und den zugehörigen Devicedateien. Im Test unterstützte die Picam Motion leider nicht. Ein wenig Recherche fördert aber ein Python-Skript [5] zu Tage, das die Arbeit ebenso erfolgreich erledigt.
Die Software nimmt zunächst ein Bild auf, verpasst den Dateien einen Zeitstempel im Dateinamen und speichert sie. Dann vergleicht das Skript in einem niedrig auflösenden Stream immer zwei aufeinanderfolgende Bilder. Überschreiten die Veränderungen einen Schwellenwert, dann speichert der Pi ein hochauflösendes Bild. Die Abbildungen 5 und 6 zeigen ein einfaches Playmobil-Testmuseum im Normalzustand und nachdem ungebetener Besuch eingedrungen ist. Wie die Bilder zeigen, hängt die Bildqualität stark vom vorhandenen Licht ab.
Noch fehlt eine Lösung, um einen Live-Videostream mehreren Clients verfügbar zu machen, am besten im Webbrowser. Da helfen entweder das altertümliche, aber verbreitete Flash oder modernes HTML 5 mit Video-Unterstützung. Noch einfacher ist jedoch die Variante mit Motion Jpeg (Mjpeg). So ein Video ist eine einfache Serie von Jpeg-Dateien. Auf die Anfrage eines Clients schickt der Server eine Serie von Bildern zurück, die der Browser als Film anzeigt.
Mjpeg-Streamer
Im Setup für Pi und Picam findet sich unter [6] eine Anleitung, wie eine Kombination aus Mjpeg-Streamer und der Picam funktioniert. Der Code für den Mjpeg-Streamer liegt nicht im Standard-Raspian-Repository, daher muss ihn der Anwender aus den Quellen bauen. Dabei reicht es, die Komponenten für eine Datenquelle und einen HTTP-Output zu übersetzen. Anschließend startet er »raspistill« mit der Timelapse-Option und speichert das so erzeugte Bild in einem Ordner, den Mjpeg-Streamer überwacht. Ein möglicher Aufruf von Raspistill wäre:
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999-th 0:0:0 &
Dabei ließe sich die Auflösung durch die Parameter »-w« und »-h« ändern. Den Streamer startet der Anwender (nach der Installation gemäß Anleitung auf [7]) folgendermaßen:
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg"-o "output_http.so -w /usr/local/www"
Abbildung 7 zeigt einen Screenshot der Webseite, die den Livestream präsentiert. Wer die Zeile
<img src="http://<i class="replaceable">Server:8080/?action=stream"/>
in sein HTML einbaut, kann ihn in einer eigenen Webseite anzeigen.
Fazit
Die Möglichkeiten, eine Netzwerkkamera zur Raumüberwachung zu bauen, sind vielfältig. Im Gegensatz zu den Kameras mit Embedded Linux, die unter [1] untersucht wurden, lässt sich ein gehärtetes System aber besser selbst aufbauen, da der Admin bei einem vollwertigen Linux selbst IPtables-Regeln definieren, den Datenstrom durch ein VPN leiten und viele andere Vorkehrungen treffen kann. Preislich gibt es günstigere Alternativen, die aber bei Weitem nicht die Flexibilität oder Sicherheit bieten wie die Lösung mit dem Raspberry Pi.
Die geschilderten Versuche stellen beileibe nicht das Ende der Fahnenstange dar: Für Nachtaufnahmen ist mittlerweile sogar eine Infrarotversion der Picam lieferbar. Auch ließe sich der Stream auf große Streamingplattformen leiten, die dann die Daten in verschiedenen Formaten und Auflösungen anbieten könnten.
Am kniffligsten für den Bastler ist in der Tat noch die Verpackung der ganzen Kombination. Zwar finden sich auch professionelle Gehäuse für die Außenmontage, aber wer sich nicht mit den Lösungen von der Stange zufriedengeben will, kann – oder muss – seine Handwerkskünste unter Beweis stellen.
Infos
- Sicherheit moderner Netzkameras: http://blog.nruns.com/blog/2013/10/28/Surveillance-Cameras-Security-Sergio/
- RS Electronics: http://www.de.rs-online.com
- Picam: http://www.raspberrypi.org/camera
- Motion: http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome
- Codebeispiel zur Bewegungserkennung: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=45235
- Beispiel einer Webcam-Anwendung:http://www.raspberrypi.org/phpBB3/viewtopic.php?t=56209
- Installation eines Mjpeg-Servers: http://blog.miguelgrinberg.com/post/how-to-build-and-run-mjpg-streamer-on-the-raspberry-pi














