seine Webcam als Überwachungskamera nutzen

Sicherlich hat der ein oder andere schon mal drüber nachgedacht, seine in der Schublade befindliche (ausrangierte) Webcam für eine sinnvolle Aufgabe zu nutzen. Auch mir ist der Nutzen einer in der Schublade liegenden Kamera zu gering. Also einmal ein wenig überlegt und die Kamera spaßeshalber zur „Überwachungskamera“ umfunktioniert. Im ersten Schritt einfach nur als Streamingkamera, um beispielsweise auf seinem Rechner das Kamerabild ansehen zu können. Der zweite Schritt (Update folgt…) erweitert die Funktion um eine Kamera mit Bewegungsmeldung, welche bei erkannter Bewegung Aktionen (beispielsweise Ausführung eines Skriptes, Verschicken einer eMail oder SMS) auslösen kann.
Grundsätzlich sollte jede halbwegs brauchbare Kamera der letzten Jahre ohne Probleme genutzt werden können. Hat man sich beim Kauf vom Preis und nicht von der Qualität leiten lassen…. vll. wird es hierbei etwas haken. Aber mit Logitech & Co. im Preisbereich ~30 Euro und natürlich mehr macht man wenig falsch. Ich habe mich für eine Logitech C510 entschieden, die ohne Anstand von Linux und MAC OS-X erkannt und genutzt werden kann. Bildqualität ist für den Preis echt OK.


  Voraussetzungen

– laufender Linux Rechner mit USB Port für den Anschluss der Kamera
– eine von Linux unterstützte Webcam
– ein paar Linux- und Shell Kenntnisse
– VLC (VideoLanClient) auf dem Server (Rechner, an dem die Kamera angeschlossen ist)
– VLC (VideoLanClient) auf dem Client (Rechner, der das Streamingbild anzeigen soll)
– etwas Geduld…


  Installation von VLC

  Auf dem Rechner mit der Kamera sowie dem Client muss vlc installiert sein. Ist dieses der Fall, kann dieser Part übersprungen werden. Andernfalls kurz mit apt installieren:

Shell # > sudo apt-get install vlc

VLC wird mit den nötigen Komponenten installiert und steht nun zur Verfügung.

Shell # > cvlc --version
VLC media player 1.1.9 The Luggage (revision exported)


  Welcher Devicename?

  Grundsätzlich werden Kameras unter (Ubuntu) Linux als /dev/videoX erkannt, wobei X eine fortlaufende Zahl darstellt. Das erste Videokamera-Device ist 0, das zweite 1 usw., je nachdem wie viele Kameras dem System zur Verfügung stellen.
Wir schauen, ob die Kamera am USB Bus erkannt wurde:

Shell # > lsusb
……
Bus 001 Device 002: ID 046d:081d Logitech, Inc.
……
(Auflistung der USB Geräte. Für mehr Infos zu den USB Geräte mit lsusb -v.)

In dmesg sieht man beim Einstecken der Kamera Meldungen wie diese:


  [1210839.650052] usb 1-6: new high speed USB device using ehci_hcd and address 2
  [1210840.463838] Linux video capture interface: v2.00
  [1210840.513060] uvcvideo: Found UVC 1.00 device (046d:081d)
  [1210840.527179] input: UVC Camera (046d:081d) as /devices/pci0000:00/0000:00:04.1/usb1/1-6/1-6:1.2/input/input2
  [1210840.527452] usbcore: registered new interface driver uvcvideo
  [1210840.527462] USB Video Class driver (v1.0.0)
  [1210840.583706] usbcore: registered new interface driver snd-usb-audio

Unter den Deviceeinträgen in /dev/ wird man (sofern alles geklappt hat) einen Eintrag videoX vorfinden:

Shell # > ls -all /dev/video*
crw-rw---- 1 besitzer video 81, 0 2011-10-09 14:44 /dev/video0

Somit haben wir nun ein Gerät, welches wir mit /dev/video0 ansprechen können.


  Kamerabild streamen – per udp Multicast

  Die erste Variante soll das Kamerabild einfach nur streamen und im gesamten Netzwerk zur Verfügung stellen. Das Kamerabild wird transkodiert und an eine Multicast-Adresse gestreamt, jeder im internen Netzwerk kann diesen Stream empfangen und entsprechend das Kamerabild anzeigen. Also ideal, wenn man mehrere Rechner hat, die das Bild abrufen sollen.

Da der Server „headless“ ist (also keine grafische X-Ausgabe hat) wird clvc genutzt. Dieses ist der Kommandozeilen-Teil von VLC, der kein X benötigt.
Wir rufen auf dem Server clvc mit folgenden Optionen auf:

Shell # > cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout "#transcode{vcodec=mpeg4,acodec=mpga,vb=800,ab=128}:standard{access=udp,
mux=ts, sap, name=live-video, dst=224.0.0.1, port=1234}"

Kurze Erklärung zu den Einstellungen, die man anpassen kann bzw. muss:
  v4l2-dev= Angabe des Devices.
  v4l2-width= Breite des Bildes
  v4l2-height= Höhe des Bildes
  vcodec= Einstellung des VideoCodecs.
  acodec= Einstellung des AudioCodecs.
  dst= Hier: Eine Multicast Adresse
  port= Einstellung des Ports.

In meinem Beispiel belassen wir die Größe auf 640 (Breite) x 480 (Höhe) Pixel. Liefert die Kamera HD Auflösung (720p oder 1080), so kann man das Bild natürlich auch größer anzeigen und die Werte entsprechend anpassen. Meine macht auch deutlich mehr, ich brauche das Bild aber nicht größer 😉
Hat man ein anderes Device als /dev/video0 (weil man z.B. zwei Kameras an dem Gerät hat), ist der Name anzupassen.


  Multicast-Stream anzeigen

  Der Client kann nun das Kamerabild empfangen. Auf der Konsole wird VLC mit vlc -vvv udp://@224.0.0.1:1234 (-vvv gibt das Verbose-Level an. funktioniert alles, kann man das auch weg lassen) gestartet. Alternativ kann man in VLC den Stream auch über den Weg im Menü öffnen und muss VLC nicht von der Konsole starten. VLC öffnen, unter Medien -> Netzwerkstream die UDP Adresse udp://@224.0.0.1:1234 eintragen.
Hat man alles richtig gemacht, öffnet sich ein Fenster mit dem gestreamten Kamerabild. Voilá.


  Kamerabild streamen – per HTTP Streaming

  Natürlich kann VLC auch HTTP Streaming und stellt somit recht einfach den Kamerastream per HTTP zur Verfügung. Einfach den Typ access=, dst= und port= ändern:

Shell # > cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout "#transcode{vcodec=mpeg4,acodec=mpga,vb=800,ab=128}:standard{access=http, mux=ts, sap, name=live-video, dst=eigene_IP, port=8080}"
(dst= ist die eigene IP Adresse des Systems. Port kann auf jeden beliebigen verstellt werden.)

VLC kann nun über Medien -> Netzwerksteam öffnen den Stream öffnen: http://IP_des_Servers:8080

Ruft man diese URL nun per Browser auf, so erscheint der Stream als aplication/octec-stream und wird ersteinmal nicht angezeigt. Hier fehlt noch ein wenig „drumherum“ um den Videostream… Hierzu empfehlenswert ist das Tool „Motion„, welches ein wenig HTML um das Bild herumbau und damit einfach und unkompliziert die Betrachtung per HTTP Browser ermöglicht


  HTTP Streaming per Motion

  Damit man das Kamerabild nicht nur über VLC oder andere Software sondern auch ganz normal per Webbrowser aufrufen und ansehen kann gibt es die Software Motion. Ein gutes kleines Tool, welches neben dem Bildstreaming per HTTP noch Bewegungserkennung, Benachrichtigungen usw. bietet. (Das aber zu späterer Zeit…)

Sofern motion noch nicht installiert ist, kann dieses aus dem Repository nachgeholt werden:

Shell # > sudo apt-get install motion

Motion wird installiert und in /etc/motion finden sich die Konfigurationsdateien. Die Konfigurationsdatei /etc/motion/motion.conf anzupassen. Für mich ergeben sich ersteinmal nur wenige Änderungen, die sich auf die Größe, Beschriftung im „Kamerabild“ und Zugriffsbeschränkung bezieht:

height 480 # Höhe des Bildes
width 640 # Breite des Bildes
framerate 10 # Bilder pro Sekunde (Bildrate); je höher, desto mehr Bilder
text_left Kamera %t # Beschriftung im Kamerabild
webcam_quality 100 # Qualität des Bildes
webcam_localhost off # Zugriff auf Kamerabild auch von „außerhalb“ des eigenen Rechners erlauben
control_localhost off # Zugriff auf Control-Interface auch von „außerhalb“ des eigenen Rechners erlauben

Danach kann man noch das Starten von Motion aktivieren. Einfach die /etc/default/motion anpassen und auf yes setzen:

# set to ‚yes‘ to enable the motion daemon
start_motion_daemon=yes

und Motion starten:

Shell # > sudo /etc/init.d/motion start
   * Starting motion detection daemon motion      [ OK ]

Über einen Webbrowser http://IP_des_Servers:8081 aufrufen. Das Bild steht nun allen Clients zur Verfügung.


  Vorteile von HTTP Streaming (per Motion)

  Wird der Stream als HTTP Stream laufen gelassen kann dieser von jedem Client mit Webbrowser auch über Netzgrenzen hinaus angezeigt werden. Das sogar von unterwegs mit iPhone & Co. Einfach einen VPN Tunnel ins Heimnetzwerk einrichten und schon kann über eine gesicherte Verbindung das Bild überall angesehen werden. Legt man keinen Wert auf die Vertraulichkeit des Bildes kann man über Portforwarding den HTTP Port für die ganze Welt freigeben.
In einer FritzBox legt man einfach einen neuen Eintrag unter Internet -> Freigaben an. Als „von Port“ trägt man beispielsweise 8888 und als „an Port“ 8081 mit der IP des Kameraservers ein. Somit kann nun von extern über einen DDNS Namen bzw. der derzeit gültigen externen IP Adresse und der Angabe von Port 8888 auf das Bild zugegriffen werden. Als Beispiel http://mein.dynamischer.name:8888

Mit all seinen Konsequenzen und Nachteilen…


  ein Schelm, wer Böses….

  Natürlich kann diese kleine Webcam-Streaminglösung auch dazu genutzt werden, das Bild einer Webcam von Laptop, Netbook & Co. zu streamen. Wird mit etwas kriminellem Aufwand eine vorhandene LED funktionsunfähig gemacht leuchtet diese nicht einmal auf, wenn das Kamerabild abgegriffen wird…. Das würde man natürlich nicht machen und selbstverständlich hält man sich an geltende Gesetze 😉


  Mögliche Probleme: VLC meldet „Permission denied“

  Sind die Rechte des Deviceeintrages nicht korrekt (d.h. gehören beispielsweise root), so kann es möglich sein, dass sich VLC nicht starten lässt. Folgende Meldungen erscheinen beim Start auf der Konsole und geben den Hinweis, dass wohl die Rechte falsch sind:


  v4l2 demux error: cannot open video device '/dev/video0' (Permission denied)
  v4l2 demux error: cannot open video device '/dev/video0' (Permission denied)
  v4l2 access error: cannot open video device '/dev/video0' (Permission denied)
  v4l2 access error: cannot open video device '/dev/video0' (Permission denied)

Ein Blick auf die Rechte zeigt, dass das Device root gehört:

Shell # > ls -all /dev/video*
crw-rw—- 1 root video 81, 0 2011-10-16 22:53 /dev/video0

Den Besitzer einfach auf den eigenen Benutzer ändern oder die Rechte erweitern, dann kann auch VLC als normaler Benutzer wieder auf das Device zugreifen.


  Fazit

  Auch ohne die derzeit eingerichtete Benachrichtigung bei Bewegung, der noch nicht eingerichteten Snapshot-Funktion usw. bietet das Kamerastreaming schon ein paar nette Ideenansätze. Viele weitere Dinge kann man mit Motion schnell und unkompliziert einrichten. Einfach mal durchlesen und selber rumtüfteln.


  Links

http://www.videolan.org/doc/streaming-howto/en/ch02.html
http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome


Dieser Beitrag wurde unter Dokus und Tipps, Linux/ UNIX, Technikspielkram abgelegt und mit , , , , , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

12 Antworten zu seine Webcam als Überwachungskamera nutzen

  1. Kurt sagt:

    Danke für das nette Tutorial. Wie kann ich den Stream per Passwort vor fremdem Zugriff schützen?

    • rotzoll sagt:

      Hej,
      zum Einen hast du natürlich erstmal „nur“ Zugriff aus deinem LAN. Wenn du noch andere Nutzer in deinem LAN hast, dann schau dir mal die .htaccess Geschichten an. Du kannst dann Zugriff auf ein Verzeichnis mit Benutzername und Passwort „sperren“. Macht natürlich nur Sinn, wenn du dann auch HTTPS im LAN nutzt. Andernfalls geht dein Benutzername und dein Passwort unverschlüsselt durch’s LAN. Und jeder in Netz kann mitlesen. DSniff und Co. sind dein Freund….

      • rotzoll sagt:

        Kleiner Fehler meinerseits 😉
        Motion stellt ja einen eigenen HTTPd zur Verfügung, der für den HTTP Zugriff zuständig ist. D

        In der motion.conf kannst du unter Angabe von:
        control_authentication meinusername:strenggeheimespassword
        den Zugriff auf die Einstellungen einschränken. Damit kann man nur noch unter Angabe der credentials auf die Einstellungs-Seite zugreifen.
        Um den Zugriff auf die Kamerabilder zu sperren musst du dir also doch ein paar mehr Gedanken machen (Iptables auf IP einschränken oder Umleitung der Bilder).

        Eine Möglichkeit wäre, den Zugriff von „außen“ zu verbieten, so dass nur lokal auf dem Rechner der Port f. die Ausgabe des Streams erreichbar ist. Dann könnte man z.B.
        mit einer SSH Verbindung und Portweiterleitung/ Socks auf den Port von draußen zugreifen.
        webcam_localhost on

        Aber alles etwas umständlicher….

        Einfach setzen, motion neu starten und die Abfrage kommt.

  2. Profundo sagt:

    Hallo,
    ich habe die Anleitung mit dem UDP-Streaming ausprobiert und es funktioniert auf Anhieb, vielen Dank. Einzig die Übertragung-Qualität ist fragwürdig, ich habe viele Artefakte und beim Client Meldungen wie:
    {{{
    [mpeg2video @ 0x7f260c0ada00] ac-tex damaged at 3 14
    [mpeg2video @ 0x7f260c0ada00] Warning MVs not available
    [mpeg2video @ 0x7f260c0ada00] concealing 66 DC, 66 AC, 66 MV errors
    [mpeg2video @ 0x7f260c0ada00] end mismatch left=4157 C034C
    [mpeg2video @ 0x7f260c0ada00] ac-tex damaged at 18 4
    [mpeg2video @ 0x7f260c0ada00] Warning MVs not available
    [mpeg2video @ 0x7f260c0ada00] concealing 44 DC, 44 AC, 44 MV errors
    [0x7f260c002058] ts demux warning: discontinuity received 0x7 instead of 0x0 (pid=68)
    [0x7f260c002058] ts demux warning: discontinuity received 0x7 instead of 0x0 (pid=68)
    [0x7f260c002058] ts demux warning: discontinuity received 0x4 instead of 0xd (pid=68)
    [mpeg2video @ 0x7f260c0ada00] skipped MB in I frame at 4 14
    [mpeg2video @ 0x7f260c0ada00] concealing 22 DC, 22 AC, 22 MV errors
    [mpeg2video @ 0x7f260c0ada00] ac-tex damaged at 6 14
    [mpeg2video @ 0x7f260c0ada00] concealing 66 DC, 66 AC, 66 MV errors
    [mpeg2video @ 0x7f260c0ada00] invalid mb type in I Frame at 2 13
    [mpeg2video @ 0x7f260c0ada00] concealing 22 DC, 22 AC, 22 MV errors
    }}}
    und so weiter.
    Kann ich das irgenwie verbessern, sorry wenn ich dumm frage, aber Video-Streaming ist Neuland für mich.

    Gruß
    Profundo

    • rotzoll sagt:

      Mit welcher Cam probierst du das? Was für ein Rechner soll das machen? Wie ist die
      Auslastung des Rechners?

      Gruß,
      Malte

  3. Maik sagt:

    Gut, der Beitrag ist von 2011, aber mittlerweile kann man glaub ich getrost einfach ne billige IP-Kamera kaufen, die einfach als eigenständiger Teilnehmer am Netzwerk fungiert (und damit zig Funktionen mehr bietet, alleine schon, dass jeder PC im Netzwerk drauf zugreifen kann ohne große Konfiguration). Wer da mehr Infos braucht, was alles geht, findet in dem Ratgeber hier ganz gute Infos:

    http://ueberwachungstechnik.eu/ueberwachungskamera-ratgeber.pdf

    • rotzoll sagt:

      Natürlich gibt es fertige Lösungen. Wenn man allerdings schon seine Hardware zu Hause stehen hat und diese damit weiternutzen bzw. einem
      weiteren Verwendungszweck zuführen kann eine wie ich finde gute Lösung.

      Was allerdings viele der bezahlbaren (wir reden hier bei Preisen bis zu 300Euro) IP-Kameras derzeit noch immer hagen: Keine brauchbare Auflösung. Natürlich ist das
      fertige Gerät, was vll. noch Pan/ Tilt-Shift usw. unterstützt eine gute Sache. Aber häufig leider bei der Bildqualität noch immer im Jahre 19hundert. Ein weiteres
      Manko dieser Kisten: Viele haben neben einer hässlichen WebGUI noch einen integrierten „Nach-Hause-Telefonierdienst“ und können (oder müssen sogar) über Dienste des
      Herstellers genutzt werden. Von Sicherheitsproblemen (in den letzten Monaten/ Jahren immer wieder aufgefallen), Bugs und schlechter Softwarepflege mal abgesehen.

      Natürlich bedient mein Beitrag nur einen sehr geringen Anwenderkreis. Und sicherlich fehlt dieser Lösung noch einiges: Nachtsichtmodus, WebGUI usw.
      Für den ambitionierten „Bastler“ aber sicher eine Variante. Zusammen mit einem RaspberryPi kann die Kiste sogar sehr klein und handlich gebaut und mit einer USB Kamera
      an einem Kabel auch an Stellen positioniert werden, wo diese nicht gleich auffällt. Nimmt man eine noch kleinere Kamera (z.B. die RaspberryCam) ist diese quasi unsichtbar
      zu positionieren…

  4. Maik sagt:

    Also HD Auflösungen kriegst du auch für unter 100 Euro, Full HD kratzt dann meist schon an der 100 Euro Grenze. Wenn du eine mit ONVIF nimmst, kannst du aus einer Vielzahl von Software wählen und bist nicht auf die hässliche GUI angewiesen, die in der Tat oftmals vorhanden ist (wird aber auch besser).

    Die Webcam- und auch RasberryPI-Lösung ist interessant und auch sehr flexibeln. Aber auch da gibts fertige Mini-WLAN-Kameras, die sogar Akkubetrieb haben, teils unter 200 Euro.

    Also ich will das nicht schlecht reden, nur drauf hinweisen, dass es auch bastelfreie Lösungen bezahlbar gibt.

  5. Mike sagt:

    Ich möchte mich mal für das Tutorial bedanken.
    kam mir gerade richtig:
    Ich nutze von Telekom eine S100-Vision mit einem Debian-Linux als Fileserver, der eh ständig läuft.
    Nu hatte ich noch eine USB-Cam zu liegen, die ich einsetzen wollte.
    Laut Anleitung fix VLC und Motion installiert, motion.conf angepasst und läuft.
    Einfacher ging nicht.
    Auch wenn der Beitrag schon älter ist, hat er immer noch nicht an Bedeutung verloren – so habe ich das Geld für eine Webcam gespaart….

  6. Sehr schönes Tutorial und einfache Lösung. Es wir auf jeden Fall vielen helfen!

  7. Vera sagt:

    Ja, mit einem passenden Programm sollte folgendes möglich sein:

    – die Kamera läuft die ganze Zeit und speichert ein Video
    – die Kamera speichert alle paar Sekunden ein Bild
    – die Kamera schaltet sich automatisch bei Bewegungen im Raum ein und stopt, sobald alles wieder ruhig ist
    – das Programm lädt das Video oder die Bilder automatisch ins Internet auf deinen Webspace (zur Fernüberwachung)
    – das Programm schickt die Bilder per Mail an eine andere Mail-Adresse (zur Fernüberwachung)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert