Raspberry als IP-Cam nutzen mit ‚motion‘

rbp-webcam (Andere)In diesem Beitrag möchte ich zeigen, wie sich ein Raspberry Pi als Kameraserver einsetzen lässt. Dazu können entweder Webcams verwendet werden, die via USB mit dem Raspberry verbunden werden oder direkt eine Cam für die spezielle Kameraschnittstelle des Raspberry. Nach diesem Beitrag sind wir in der Lage, via URL die am Raspberry angeschlossene oder via Netzwerk erreichbare Kamera zu betrachten sowie die Bewegungserkennung ein- und auszuschalten.

 

 

 

 

 

System aktualisieren

Vorbereitend aktualisieren wir unser System, wie vor jedem neuen Projekt:

apt-get update && apt-get upgrade -y

 

USB-Kamera anschließen

Nach der Aktualisierung und ggf. einem Neustart des Systems schließen wir die Kamera an einen freien USB-Port des Raspberry. Dabei sollte beachtet werden, dass ein solches Multimedia-Device eine gewisse Leistung benötigt und das 5V-Netzteil dementsprechend dimensioniert ist. Ich bin für dieses System mit einem 1,5A Netzteil bisher gut ausgekommen.

Nach dem Anschließen prüfen wir mit

dmesg |tail

ob die Kamera vom System erkannt wurde.

motion3

 

Wurde die Kamera vom System erfolgreich erkannt, prüfen wir mit

ls -ltrh /dev/video*

unter welchem Pfad die Kamera im System eingebunden wurde. Diesen Pfad benötigen wir gleich für die Konfiguration.

motion4

 

motion installieren

Anschließend installieren wir das Programm motion mittels des Debian-Paketinstallers.

apt-get install motion

 

Wollen wir Videos aufzeichnen, benötigen wir noch das Paket „ffmpeg„, welches wir leider nicht in einemRepository vorfinden. Daher installieren wir dieses händisch mit:

wget https://github.com/ccrisan/motioneye/wiki/precompiled/ffmpeg_2.8.3.git325b593-1_armhf.deb
dpkg -i ffmpeg_2.8.3.git325b593-1_armhf.deb

 

Autostart konfigurieren

Nun konfigurieren wir unser System so, dass motion beim Systemstart ebenfalls gestartet wird. Dazu öffnen wir die Datei „/etc/default/motion“ mit einen Texteditor unserer Wahl, beispielsweise nano

nano /etc/default/motion

…und ändern hier den Eintrag

start_motion_daemon=no

auf

start_motion_daemon=yes

Haben wir dafür den Texteditor nano verwendet, können wir diesen mit der Tastenkombination STRG+x verlassen und bestätigen die Abfrage, ob die Dateiänderungen gespeichert werden sollen mit Ja.

 

Grundkonfiguration

Die hauptsächliche Konfiguration findet in der Datei „/etc/motion/motion.conf“ statt. Eine komplette Auflistung aller möglichen Konfigurationsmöglichkeiten findet man direkt beim Entwickler.

Wir verwenden in diesem Beitrag die Webcam „Microsoft VX-5000„, welche via USB angeschlossen ist. Hierfür zeige ich eine mögliche Grundkonfiguration von motion. Zuvor sichern wir jedoch die bereits vorhandene Standardkonfiguration mit

mv /etc/motion/motion.conf /etc/motion/motion.conf.bak

und erstellen eine neue Konfiguration mittels

nano /etc/motion/motion.conf

mit folgendem Inhalt:

daemon on
process_id_file /var/run/motion/motion.pid
videodevice /dev/video0
v4l2_palette 8
input 8
norm 0
width 640
height 480
framerate 2
output_all off
ffmpeg_cap_new off
output_motion off
output_normal off
quality 100
target_dir /tmp/motion
text_right
webcam_port 8081
webcam_quality 100
webcam_maxrate 2
webcam_localhost off

 

Zur Erläuterung einzelner Konfigurationszeilen:

daemon on
process_id_file /var/run/motion/motion.pid
videodevice /dev/video0
v4l2_palette 8
input 8
norm 0
width 640
height 480
framerate 2
output_all off
ffmpeg_cap_new off
output_motion off
output_normal off
quality 100
target_dir /tmp/motion
webcam_port 8081
webcam_quality 100
webcam_maxrate 2
webcam_localhost off
motion wird als Hintergrundprozess gestartet
hier wird die Prozess-ID angegeben
welches Video-Device soll verwendet werden? (siehe „Kamera anschließen“)es handelt sich um eine USB-Cam
wir nutzen die PAL-Norm
Breite des Ausgabevideos
Höhe des Ausgabevideos
Anzahl der Bilder pro Sekunde, die von der Cam empfangen werden sollen
Es werden keine Bilder kontinuierlich gespeichert
Es werden keine Videos erstelltEs werden keine Bilder bei erkannter Bewegung erstellt
Die JPEG-Qualität wird auf 100% belassen
Der Speicherort der zu speichernden Bilder
Der Port, über den motion erreichbar ist und das Kamerabild anzeigt
Die Bildqualität in Prozent, die über den Webserver ausgegeben wird
Die Bilder pro Sekunde, die über den Webserver ausgegeben werden
Deaktivierung der Option, dass der Webserver nur über „localhost“ erreichbar ist.

Mit den zusätzlichen Optionen

text_right %d.%m.%Y - %H:%M:%S
text_left Klenzel::Demo

lässt sich über das Bild der Webcam ein Text ausgeben. Im angegeben Beispiel wird links ein statischer Text und auf der rechten Seite das Datum mit Uhrzeit angezeigt.

Mit der bisherigen Konfiguration können wir nun bereits motion mittels

/etc/init.d/motion start

starten und mit

ps aux |grep motion

prüfen, ob der Prozess läuft.

 

motion1

 

War der Start erfolgreich, können wir bereits jetzt das Bild der Kamera im Browser mit folgender Adresse betrachten:

http://ip_deines_raspberry:8081

 

motion2

 

 

 

Bewegungserkennung ohne Aufnahme

motion bietet die Möglichkeit, Bewegungen im Bild zu erkennen. Bei erkannten Bewegungen können Bilder oder Videos erstellt werden, die an einem zuvor definierten Speicherort hinterlegt werden. Oder es besteht die Möglichkeit, bei einer Bewegung ganze Befehle oder eigene Scripts zu starten.

Dazu ist es notwendig, die Konfiguration zu erweitern bzw. anzupassen.

threshold 1500
on_event_start echo "AN" >> /tmp/motion.txt
on_event_end echo "AUS" >> /tmp/motion.txt

 

Threshold legt dabei die Anzahl der Pixel fest, mit der sich ein Bild vom vorhergehenden Bild unterscheiden muss, damit eine Bewegung als solche interpretiert wird. Mit diesem Wert muss ein wenig herumgespielt werden, im Innenbereich mag dieser passen, jedoch wäre ein Wert von 1500 für den Außeneinsatz zu empfindlich.

Mit den Zeilen „on_event_start“ und „on_event_stop“ lassen sich Befehle und Scripte definieren, welche bei einer erkannten Bewegung bzw. nach einer gewissen Zeit der Ruhe ausgeführt werden. In unserem Beispiel werden lediglich die Wöter „An“ und „Aus“ in die Datei „/tmp/motion.txt“ geschrieben, um den Erfolg zu prüfen. Denkbar wären hier jedoch unzählige Möglichkeiten, wie beispielsweise das Versenden einer eMail oder das Setzen eines Status bei openHAB.

Nach jeder Änderung der Konfigurationsdatei ist es notwendig, motion mittels

/etc/init.d/motion restart

neu zu starten.

 

Bewegungserkennung mit Aufnahme

Soll motion bei einer erkannten Bewegung ein Video vom Geschehen aufzeichnen, ändern wir in unserer Konfiguration die Zeile

ffmpeg_cap_new off

in

ffmpeg_cap_new on

und ergänzen unsere Konfiguration mit folgenden Zeilen:

snapshot_filename %v-%Y%m%d%H%M%S-snapshot
movie_filename %v-%Y%m%d%H%M%S
ffmpeg_video_codec swf

Nun wird bei jeder Bewegung ein Video im Format eines Flash-Movies im Ordner /tmp/motion/ erstellt und mit der Uhrzeit des Geschehens benannt. Denkbar wäre hier eine Einbindung eines NAS-Systems mittels NFS oder SMB und die Konfiguration von motion zur Speicherung in den eingebundenen Ordner.

Auch hier ist die Option

threshold 1500

anzuwenden und motion nach Änderung der Konfiguration mittels

/etc/init.d/motion restart

neu zu starten.

motion5

Externe Steuerung

motion lässt sich zusätzlich von außen steuern. Möchten wir beispielsweise die Bewegungserkennung aktivieren oder deaktivieren, ergänzen wir unsere Konfiguration durch folgende Zeilen:

control_port 8080
control_localhost off

Damit richten wir einen Kontrollschnittstelle auf Port 8080 ein und lassen die Steuerung auch außerhalb von localhost zu.

Nun ist es möglich, von einem externen System die Bewegungserkennung mit dem Aufruf von

curl --silent --max-time 2 --connect-timeout 2 http://ip_des_raspberry:8080/0/detection/pause &> /dev/null

zu pausieren und mit dem Aufruf von

curl --silent --max-time 2 --connect-timeout 2 http://ip_des_raspberry:8080/0/detection/start &> /dev/null

wieder zu reaktivieren.

 

Mehrere Kameras verwalten

Es besteht die Möglichkeit, auch mehr als eine Kamera mit motion zu betreiben. Dabei prüfen wir zunächst wie Eingangs gezeigt, unter welchen Pfaden unsere Kameras im System eingebunden wurden und reduzieren die Hauptkonfiguration /etc/motion/motion.conf auf das folgende:

daemon on
process_id_file /var/run/motion/motion.pid

control_port 8080
control_localhost off

thread /etc/motion/cam1.conf

Nun erstellen wir für jede Kamera eine seperate Konfigurationsdatei und verweisen in der motion.conf auf diese:

thread /etc/motion/cam1.conf

 

Eine Konfigurationsdatei könnte beispielhaft (z.B. /etc/motion/cam1.conf) wie folgt aussehen:

videodevice /dev/video0
width 640
height 480
framerate 2
output_all off
ffmpeg_cap_new on
output_normal off
quality 100
text_right %d.%m.%Y - %H:%M:%S
text_left Klenzel::Demo
threshold 1500
target_dir /tmp/motion/cam1
movie_filename %v-%Y%m%d%H%M%S
ffmpeg_video_codec swf

auto_brightness on
threshold 6000
noise_tune on
minimum_motion_frames 2

webcam_port 8081
webcam_quality 100
webcam_maxrate 2
webcam_localhost off

on_event_start curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "ON" http://openhab/rest/items/MOTION_CAM1/state
on_event_end curl --max-time 2 --connect-timeout 2 --header "Content-Type: text/plain" --request PUT --data "OFF" http://openhab/rest/items/MOTION_CAM1/state

Dabei ist natürlich zu beachten, dass die Zeilen „videodevice„, „target_dir“ und „webcam_port“ für alle Kameras individuell angepasst werden müssen. Soll eine Bewegungserkennung eingerichtet werden, ist die Zeile „threshold“ natürlich wieder mit anzugeben.

 

Einbinden einer vorhandenen IP-Cam

Aus verschiedenen Gründen kann es interessant sein, keine lokale USB-Kamera sondern eine bereits vorhandene Netzwerkkamera in motion einzubinden. Möglicherweise unterstützt die IP-Kamera keine Bewegungserkennung und das soll nun mittels motion nachgerüstet werden.

In diesem Fall wird die Zeile

videodevice /dev/video0

durch die folgende Einbindung ersetzt:

netcam_url http://stream_adresse_der_netzwerkkamera

 

Die genaue Adresse für seine IP-Cam findet man meistens im Internet, beispielsweise lautet diese für eine D-Link DCS932L wie folgt:

http://ip_der_dcs932l/mjpeg.cgi

 

Weitere Möglichkeiten

Eine weitere Möglichkeit, mehrere Kamera(quellen) zu verwalten und in einer netten Weboberfläche anzuzeigen, zeigt dieser Artikel über motioneye.

Möchte man auf eine Bewegungserkennung verzichten und lediglich die lokal angeschlossene Kamera streamen (z.B. an eine übergeordnete motion-Instantz), so könnte sich eine Alternative mittels mjpg_streamer anbieten, was in diesem Beitrag beschrieben ist.