Springe zum Inhalt

22

Dieser Artikel behandelt das einfache Streamen eines mit dem Kameramodul des Raspberry Pi aufgenommenen Videostreams über das Netzwerk an einen anderen Computer. Wie sich der Raspberry Pi in eine Überwachungskamera mit automatisierter Aufnahme verwandeln lässt, habe ich in einem anderen Artikel beschrieben.

Übertragung mit Netcat

Mit dem vorinstallierten Programm raspivid lässt sich einfach auf den Videostream des Raspberry Pi Kameramoduls zugreifen. Für eine Übertragung an einen anderen Rechner im lokalen Netzwerk können folgende Kommandos verwendet werden.

Falls nicht schon geschehen, muss zuvor das Programm netcat installiert werden:

sudo apt-get install netcat

Anschließend wir der Videostream auf dem Rasperry Pi gestartet:

raspivid -t 0 -o - | nc 192.168.1.64 5001

Die IP-Adresse muss mit der IP-Adresse des Computers ersetzt werden, auf dem nachher das Video angezeigt werden soll. Mit den obigen Optionen wird ein Videostream in voller Auflösung (1920x1080) und 30 fps an den angegebenen Computer gesendet.

Auf dem Computer, auf dem das Video angezeigt werden soll:

nc -l -p 5001 | mplayer -fps 31 -cache 1024 -

Für die Übertragung in kleineren Auflösungen kann das obige Kommando raspivid um die Optionen -w für Breite und -h für Höhe ergänzt werden (z.B. -w 1280 -h 720).

Übertragung mit VLC und RTSP

Sollen mehrere Benutzer gleichzeitig einen Videostream anschauen können, kann obige Methode nicht verwendet werden. Hier bietet sich der Einsatz RTSP an, welches z.B. VLC hervorragend beherrscht.

Sofern noch nicht geschehen, wird VLC mit folgendem Kommando auf dem Raspberry Pi installiert:

sudo apt-get install vlc

Danach wird der VLC-Videoserver auf dem Raspberry Pi gestartet:

raspivid -o - -t 0 -n -vf -hf -w 1280 -h 720 -fps 25 -g 100 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/,mux=ts}' :demux=h264

Obiges Kommando enthält Optionen, die das Video vertikal und horizontal spiegeln (-vf -hf), da mein Raspberry Pi auf dem Kopf steht. Bei Bedarf können diese entfernt werden.

Zum Betrachten des Videostreams auf einem anderen Computer:

vlc rtsp://raspberrypi.local:8554/

raspberrypi.local muss dabei mit der IP-Adresse oder Hostnamen ersetzt werden, unter der der Rasperry Pi im lokalen Netzwerk erreichbar ist. Alternativ kann die Adresse des Videostreams auch über die GUI von VLC unter Medien -> Netzwerkstream öffnen... eingegeben werden.

25

Mit einem Raspberry Pi, einer Webcam oder dem Raspberry-Pi-Kameramodul ist es relativ einfach, eine Überwachungskamera zu realisieren. Mit der Software motion wird anschließend aufgezeichnet, wenn sich im Bild etwas bewegt. In der folgenden Anleitung möchte ich Schritt für Schritt beschreiben, wie das Ganze in Betrieb genommen werden kann.

Kamera

USB-Webcam

Evtl. kann eine bereits vorhandene Webcam verwendet werden. Ist die Webcam mit Raspbian, der für Raspberry Pi angepassten Version von Debian Wheezy, kompatibel, sollte nach dem Anstecken der Kamera automatisch ein Device /dev/video* erstellt worden sein. Informationen über den Initalisierungsprozess der Kamera können mit folgendem Kommando angezeigt werden:

dmesg | tail

Raspberry Pi Kameramodul

Seit kurzem ist ein Treiber verfügbar, der das Rasperry Pi Kameramodul als /dev/video*-Gerät zur Verfügung stellt. Zuerst muss das entsprechende Repository eingebunden werden und anschließend die benötigte Software installiert werden.

Repositiory eintragen:

echo deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main | sudo tee /etc/apt/sources.list.d/uv4l.list

Signaturkey des Repositorys einbinden:

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

Repositories neu laden und Kameramodul installieren:

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam uv4l-raspicam-extras

uv4l enthält grundelegende Module, uv4l-raspicam den Treiber zum Ansprechen des Rasperry-Pi-Kameramoduls und uv4l-raspicam-extras ein Skript, welches beim Starten des Rasperry Pi automatisch den erforderlichen Treiber läd.

Anschließend wird der Treiber gestartet:

sudo service uv4l_raspicam start

Jetzt sollte unter /dev/video* ein entsprechendes Gerät erstellt worden sein.

Bewegungserkennung

Mit der Software motion ist ein Paket verfügbar, mit dem sich Videostreams auf Änderungen untersuchen lassen und anschließend automatisch aufgezeichnet werden können.

sudo apt-get install motion

Leider hat das Startskript von motion in der Version 3.2.12 noch einen Fehler: es wird beim Starten des Services nicht die Konfigurationsdatei /etc/motion/motion.conf verwendet. Ausserdem ist zum Einbinden des Raspberry-Pi-Kameramoduls eine weitere Anpassung notwendig.

Editieren des Startskripts von motion:

sudo editor /etc/init.d/motion

unter der Zeile DESC="motion detection daemon" wird folgende Zeile eingefügt:

CONFIG_FILE=/etc/motion/motion.conf

Die Zeile, in der Motion gestartet wird, wird folgendermaßen abgeändert, so dass das angegebene Config-File verwendet wird:

if start-stop-daemon --start --oknodo --exec $DAEMON -b --chuid motion -- -c $CONFIG_FILE ; then

Wird das Raspberry-Pi-Kameramodul verwendet, muss vor dem Starten von motion noch folgendes ins Startskript eingetragen werden:

export LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so

Das vollständige Startskript für motion kann hier heruntergeladen werden.

Anschließend stellt man in der Datei /etc/default/motion noch ein, dass motion nach jedem Reboot automatisch gestartet wird und startet den Service anschließend per Hand:

sudo editor /etc/default/motion
sudo service motion start

In der Default-Konfiguration werden jetzt bei Bewegungserkennung unter /tmp/motion/ Bilder und Videos abgelegt. Auf dem Raspberry Pi können über den Browser Vorschaubilder der Kamera angezeigt werden. Unter http://localhost:8081 sind Livebilder der Kamera zu sehen und unter http://localhost:8080 ist ein Steuerungsinterface von motion zugänglich.

Standardmäßig sind die Vorschaubilder und das Steuerungsinterface nur lokal auf dem Raspberry Pi abrufbar. Will man die Bilder auch auf einem anderen Rechner im Netzwerk betrachten, muss in der Datei /etc/motion/motion.conf der Eintrag webcam_localhost auf off gestellt und anschließend motion neu gestartet werden.

Fehlersuche

Zuerst sollte überprüft werden, ob sich nach dem Starten von motion im Syslog ungewöhnliche Einträge wiederfinden. Ein normaler Start von motion mit dem Rasperry-Pi-Kameramodul sieht wie folgt aus:

Feb 11 08:38:08 pi motion: [26134344] Processing thread 0 - config file /etc/motion/motion.conf
Feb 11 08:38:08 pi motion: [26134344] Motion 3.2.12 Started
Feb 11 08:38:08 pi motion: [26134344] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478785
Feb 11 08:38:08 pi motion: [0] Thread 1 is from /etc/motion/motion.conf
Feb 11 08:38:08 pi motion: [1] Thread 1 started
Feb 11 08:38:08 pi motion: [0] motion-httpd/3.2.12 running, accepting connections
Feb 11 08:38:08 pi motion: [0] motion-httpd: waiting for data on port TCP 8080
Feb 11 08:38:08 pi motion: [1] cap.driver: "raspicam"
Feb 11 08:38:08 pi motion: [1] cap.card: "Camera Board OV5647"
Feb 11 08:38:08 pi motion: [1] cap.bus_info: "CSI"
Feb 11 08:38:08 pi motion: [1] cap.capabilities=0x05000001
Feb 11 08:38:08 pi motion: [1] - VIDEO_CAPTURE
Feb 11 08:38:08 pi motion: [1] - READWRITE
Feb 11 08:38:08 pi motion: [1] - STREAMING
Feb 11 08:38:08 pi motion: [1] Test palette YU12 (640x480)
Feb 11 08:38:08 pi motion: [1] Using palette YU12 (640x480) bytesperlines 960 sizeimage 460800 colorspace 00000000
Feb 11 08:38:08 pi motion: [1] found control 0x00980900, "brightness", range 0,100 
Feb 11 08:38:08 pi motion: [1] #011"brightness", default 50, current 50
Feb 11 08:38:08 pi motion: [1] found control 0x00980901, "contrast", range -100,100 
Feb 11 08:38:08 pi motion: [1] #011"contrast", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x00980902, "saturation", range -100,100 
Feb 11 08:38:08 pi motion: [1] #011"saturation", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x0098090e, "red balance", range 0,800 
Feb 11 08:38:08 pi motion: [1] #011"red balance", default 100, current 100
Feb 11 08:38:08 pi motion: [1] found control 0x0098090f, "blue balance", range 0,800 
Feb 11 08:38:08 pi motion: [1] #011"blue balance", default 100, current 100
Feb 11 08:38:08 pi motion: [1] found control 0x08000000, "shutter speed", range 0,65535 
Feb 11 08:38:08 pi motion: [1] #011"shutter speed", default 0, current 0
Feb 11 08:38:08 pi motion: [1] found control 0x08000001, "zoom factor", range 1,8 
Feb 11 08:38:08 pi motion: [1] #011"zoom factor", default 0, current 1
Feb 11 08:38:08 pi motion: [1] mmap information:
Feb 11 08:38:08 pi motion: [1] frames=4
Feb 11 08:38:08 pi motion: [1] 0 length=460800
Feb 11 08:38:08 pi motion: [1] 1 length=460800
Feb 11 08:38:08 pi motion: [1] 2 length=460800
Feb 11 08:38:08 pi motion: [1] 3 length=460800
Feb 11 08:38:08 pi motion: [1] Resizing pre_capture buffer to 1 items
Feb 11 08:38:09 pi motion: [1] Started stream webcam server in port 8081

Ebenfalls kontrolliert werden kann, ob motion auf den voreingestellten Ports lauscht:

sudo netstat -tlpn

In der angezeigten Liste sollte motion bei den Ports 8080 und 8081 auftauchen.

Immer mehr Server sind nicht nur über IPv4 sondern auch über IPv6 erreichbar. Dumm nur, wenn apt-get die IPv6-Adresse verwendet, obwohl gar keine IPv6-Konnektivität ins weite Netz besteht. Mit -o Acquire::ForceIPv4=true zwingt man apt, IPv4 zu verwenden. Die Einstellung dauerhaft macht man in der Datei /etc/apt/apt.conf.d/99force-ipv4, indem man dort Acquire::ForceIPv4 "true"; einträgt.

2

Zugegeben, der Titel ist etwas irreführend, denn genau genommen wird die Aktualisierung unter Windows (in einer virtuellen Maschine auf einem Linux Host) durchgeführt. Erfreulich ist, dass das devolo-Verwaltungsprogramm auch damit klar kommt und die Adapter bei entsprechender Netzwerkkonfiguration updaten kann.

Standardmäßig wird unter der in Linux integrierten Virtualisierungssoftware KVM/QEMU den virtuellen Maschinen ein eigenes Netzwerk zugeordnet, welches dann per NAT auf das außen liegende Netzerk und auch das Internet zugreift. Aus diesen "geNATteten" Netzwerken findet das devolo-Tool die dLAN-Adapter nicht, da es offenbar mit Broadcasts arbeitet, die über NAT nicht weitergeleitet werden.

Die einfachste Möglichkeit ist, die virtuelle Maschine über eine Bridge anzuschließen. Sie liegt dann im gleichen Netzwerk wie die anderen Geräte und somit auch die dLAN-Adapter. Im virt-manager, einem einfachen Tool um die virtuellen Maschinen für KVM zu verwalten, ist es einfach möglich, ein weiteres Interface anzulegen und dieses als Bridge für eth0 zu definieren.

virt-manager br0 einrichten

Anschließend wird br0 der Netzwerkschnittstelle der virtuellen Maschine zugeordnet. Natürlich muss im Netzwerk dann auch ein DHCP-Server laufen (meistens durch den Router bereitgestellt), der der virtuellen Maschine dann auch eine IP-Adresse aus dem Bereich des lokalen LANs zuordnet.

Nach all dem findet das devolo-Verwaltungstool alle dLAN-Adapter im lokalen Netz und kann auf diesen ein Firmwareupdate durchführen.

Falls das zu übertragende IP-Paket größer als die maximale Transfergröße (MTU) ist, wird dem Sender per ICMP mitgeteilt, dass eine Fragmentierung durchzuführen ist, die Daten also in kleineren Häppchen zu senden sind. Manche ISPs blockieren ICMP oder lassen nur bestimmte ICMP-Nachrichten durch, was dann dazu führt, dass der Sender nie erfährt, dass die Übertragung nicht funktioniert hat. Gleiches kann bei VPN-Verbindungen (IPSEC, OpenVPN) passieren, die mit ICMP nicht korrekt umgehen. Symptome sind dann:

  • Webbrowser stellen zwar eine Verbindung zum Webserver her, stecken dann aber beim Empfang der Webseite fest
  • sehr kleine E-Mails können versand werden, größere hingegen nicht
  • SSH arbeitet korrekt, aber SCP hängt bei der ersten Übertragung fest
    (Quelle: Man-Page iptables-extensions)

Für solche Fälle kann mit Hilfe von iptables und der Erweiterung TCPMSS die MTU der Verbindung auf die maximal zulässige Größe auf diesem Transportpfades gesetzt werden. Dadurch können alle TCP-Pakete ohne Fragmentierung übertragen werden.

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Auf einem Server (nicht Router) tauscht man in obigem Kommando FORWARD gegen OUTPUT.

Anschließend muss noch ein (distributionsabhängiger) Weg gefunden werden, diese Regel nach einem Neustart des Servers automatisch zu laden.

Bild by Fabienne Serriere [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons