Open-Source-Sicherheitskamera auf Raspberry-Pi-Basis
(github.com/TzuHuanTai)- Raspberry Pi WebRTC ist ein auf C++20 basierendes Projekt, das einen Raspberry Pi oder NVIDIA Jetson in eine WebRTC-Streaming-Plattform mit etwa 200 ms Latenz verwandelt
- Es nutzt natives WebRTC und unterstützt Hardware-/Software-Encoding, Schnappschüsse, Aufzeichnung, Broadcasting, Fernsteuerung und IoT-Messaging über WebRTC DataChannel
- Als Signalisierung werden MQTT, WHEP und WebSocket unterstützt; MQTT dient dazu, dass Pi-Kamera und Client Informationen für die WebRTC-Verbindung austauschen
- Unterstützte Geräte sind Raspberry Pi Zero/3/4/5 und NVIDIA Jetson Nano/NX/Orin; als Kamera kann CSI oder USB verwendet werden, und unterstützt werden müssen libcamera, libargus und V4L2
- Auf Pi 5 oder Geräten ohne Hardware-Encoder muss
--hw-accelaus den Startoptionen entfernt werden; WHEP benötigt keinen Broker, aber einen öffentlichen Hostnamen
Projektüberblick
- Raspberry Pi WebRTC ist ein Projekt, das einen Raspberry Pi oder NVIDIA Jetson in eine WebRTC-Streaming-Plattform mit geringer Latenz verwandelt
- Die angestrebte Latenz liegt bei etwa 200 ms
- Die wichtigsten technischen Angaben sind wie folgt
-
libwebrtc m146.7680
-
C++20
- Apache 2.0-Lizenz
-
Unterstützte Funktionen
- Bietet Streaming auf Basis von nativem WebRTC
- Für die Video-Encoding werden Hardware-Encoding und Software-Encoding unterstützt
- Zu den Kamerafunktionen gehören Schnappschüsse, Aufzeichnung und Broadcasting
- Unterstützt Fernsteuerung und IoT-Messaging über den WebRTC-DataChannel
Signalisierung und Clients
- Unterstützt MQTT-Signalisierung
- Unterstützt WHEP-Signalisierung
- Unterstützt WebSocket-Signalisierung
- picamera.js: SFU-Signalisierung und Broadcasting
Anforderungen
- Unterstützte Boards sind Raspberry Pi Zero/3/4/5 oder NVIDIA Jetson Nano/NX/Orin
- Es können CSI- oder USB-Kameras verwendet werden
- Der Kameraeingang muss libcamera, libargus oder V4L2 unterstützen
Raspberry Pi Schnellstart
- Raspberry Pi OS installieren
- Mit Raspberry Pi Imager Lite OS auf die SD-Karte flashen
- Abhängigkeiten installieren
libmosquitto1,pulseaudio,libavformat61,libswscale8,libyaml-cpp0.8installieren
- Binärdatei herunterladen
- Die aktuelle Release-Binärdatei herunterladen und entpacken
- MQTT-Signalisierung
Ausführung und Hinweise
- picamera-web öffnen, die MQTT-Einstellungen hinzufügen und dann eine
UIDerzeugen - Auf dem Pi
./pi-webrtcausführen und Optionen für Kamera, FPS, Auflösung, MQTT-Host, Port, Benutzername, Passwort, UID usw. angeben - Beispieloptionen sind
--camera=libcamera:0,--fps=30,--width=1280,--height=960,--use-mqtt,--no-audiousw. --hw-accelist eine Option für Hardware-Encoding auf Pi Zero 2W, 3B, 4B- Auf Pi 5 oder Geräten ohne Hardware-Encoder muss
--hw-accelentfernt werden
Erweiterte Nutzung
- Live-Stream über SFU an mehr als 1.000 Zuschauer senden
- V4L2-Treiber verwenden: für USB-Kameras
- Als Linux-Service ausführen
- Aufzeichnung
- Bidirektionale Audiokommunikation
- Bidirektionales DataChannel-Messaging
- AI oder einen benutzerdefinierten Feed als virtuelle Kamera streamen
- WHEP mit Nginx-Proxy verwenden
- WebRTC Camera in Home Assistant verwenden
1 Kommentare
Hacker-News-Kommentare
Ich musste einmal ein Haus während einer Renovierung aus der Ferne überwachen und wollte dafür eines der stark beworbenen Sicherheitssysteme installieren, die mir Bekannte empfohlen hatten. Billig war das nicht, und erst bei der Einrichtung stellte sich heraus, dass die meisten Funktionen, die ich wollte, Breitband-Internet voraussetzten.
In keinem Marketingmaterial stand etwas von dieser Voraussetzung, und das Haus hatte keinen Internetanschluss. Ich hatte auch keine Lust, 40 Dollar im Monat für das Sicherheitssystem plus mindestens 60 Dollar für Internet zu zahlen.
Stattdessen habe ich eine Raspberry-Pi-Kamera an einen vorhandenen RPi Zero 2W gehängt, dazu einen LTE-Hotspot und eine T-Mobile-Prepaid-SIM für 5 Dollar im Monat gekauft.
Als Software nutzte ich imgcomp, das jede Sekunde ein Foto auf eine RAM-Disk speicherte. Wenn sich zwei Bilder abgesehen von Rauschen unterschieden, lud der Pi das veränderte Bild in ein VPS-Verzeichnis hoch, was wiederum Gotify auslöste, damit ein Link zum Foto als Benachrichtigung aufs Handy geschickt wurde.
Insgesamt war das zwar eine Rube-Goldberg-Konstruktion, hat aber über Jahre hinweg fast perfekt funktioniert.
Ich hatte früher etwas Ähnliches gebaut: https://youtube.com/watch?v=5E7_40PWqiQ
Während unser Haus gebaut wurde, wohnten wir in einer Wohnung, und ich wollte mit einer Kamera ein Zeitraffervideo erstellen und zusätzlich über das Internet darauf zugreifen können, um zu sehen, wie die Arbeiter vorankommen.
Leider stellte sich bei jeder Idee heraus, dass sie schon jemand gebaut hatte, in diesem Fall aus China. Auf AliExpress gibt es ziemlich gute Kameras, die all das und noch mehr können, und sie sind besser verarbeitet als mein unbeholfenes 3D-gedrucktes Gehäuse.
Mein Traum ist es, so ein Gerät zu bauen und über Tor Fernzugriff darauf zu ermöglichen. Dann könnte es komplett lokal bleiben und trotzdem von überall auf der Welt erreichbar sein.
Als alternatives Projekt, das ich für einen Raspberry Pi Zero WH in Betracht gezogen hatte, gibt es mediamtx.
https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras
Das ist ein gutes Beispiel für den Einsatz von WebRTC, und seltsamerweise wird WebRTC immer noch nicht genug genutzt.
Wenn man self-hosted arbeitet und über mobile Daten aus der Ferne auf einen Signaling-Server zugreifen will, muss man bei dynamischen IPs des ISP möglicherweise DDNS und Port-Forwarding einrichten.
Allerdings setzt man den Server damit dem Internet aus. Stattdessen kann man eine Open-Source-Lösung nutzen, die eine private Verbindung zwischen Pi und Server herstellt. Dann muss man keinen Netzwerkzugang zum Server öffnen und braucht weder statische IP noch Port-Forwarding.
Mich würde interessieren, warum du meinst, dass WebRTC Schwierigkeiten hatte, sich breit durchzusetzen. Ob es an der Softwarequalität liegt, an Lernmaterialien oder etwas anderem – ich bin immer auf der Suche nach neuen Projekten.
Ich verstehe den Teil nicht ganz, dass der Raspberry Pi 5 kein v4l2-Hardware-Encoding unterstützt. In Videodekodierung wurde doch so viel Aufwand gesteckt – warum gibt es dann keinen Encoder?
Zwischen Encoding und Decoding gibt es Überschneidungen, aber selbst bei meiner Arbeit am Opus-Codec gab es ziemlich viel Code, der nur auf eine der beiden Richtungen zutraf.
Genau so etwas habe ich gesucht. Ich wollte Personenerkennung laufen lassen.
Ich verwende yolov3-tiny, zwar nicht das Neueste, aber ein sehr leichtgewichtiges Computer-Vision- und Machine-Learning-Modell, und optimiere gerade die Inferenzleistung in C++, um rund ums Haus Personen in Echtzeit zu erkennen.
Wenn nachts jemand das Grundstück betritt, sollen automatisch Sirene und Beleuchtung angehen, um Eindringlinge abzuschrecken.
https://github.com/jmaczan/yolov3-tiny-openvino
Ich habe mir eher ein System vorgestellt, bei dem Licht und Sirene schrittweise aktiviert werden, je näher jemand kommt. So könnte man viel früher reagieren und einem potenziellen Eindringling ausreichend signalisieren, dass er verschwinden soll.
Es scheint effektiver zu sein, in der Feedbackschleife das Adrenalin langsam zu steigern. Einen plötzlichen Effekt muss man nur einmal beurteilen.
Ich habe vor Kurzem ein dauerhaft laufendes Aufnahmegerät gebaut. Der Hauptzweck ist, Audio kontinuierlich weiter aufzuzeichnen – nicht zur Überwachung, sondern für Musiker und Kreative, die bei einer großartigen Performance nicht daran denken wollen, rechtzeitig den Aufnahme-Button zu drücken.
Ich habe einen Zero-W, ein etwas heikles Shell-Skript für
arecord/aplayund ein turboLua-Frontend verwendet, und das funktioniert ziemlich gut.Es nimmt dauerhaft auf, löscht aber nur „altes“ Audio, das die vom Nutzer gewählte Aufbewahrungsdauer überschritten hat. Zur Auswahl stehen 1 Minute, 5 Minuten, 15 Minuten, 30 Minuten, 1 Stunde, 3 Stunden, 5 Stunden und bis zu 24 Stunden.
Ich habe auch ein Frontend gebaut, mit dem Nutzer Zeitabschnitte, in denen sie etwas Gutes aufgenommen haben, auf Keep setzen können. Diese Heuristik ähnelt dem Deadman-Switch-/Sicherheitskamera-Mechanismus vieler Überwachungsprodukte.
Es funktioniert so gut, dass ich mich frage, warum das noch kein Standard geworden ist. Vermutlich spielt noch immer die wirtschaftliche Präferenz mit hinein, Speicherplatz nicht vollzuschreiben, aber heutzutage hält selbst 128 GB ziemlich lange.
Irgendwann wird sich so etwas wohl verbreiten. Es ist ziemlich inspirierend, das Ding aufzustellen, es zu vergessen, dann stundenlang zu jammen und am Ende nur noch das behalten zu müssen, was man wirklich sichern will, während der Rest automatisch aufgeräumt wird.
Das alte Projekt RPi Cam Web Interface sollte man auch nicht vergessen. Es ist ziemlich alt, läuft aber immer noch auf meinen Pis.
Ich betreibe es in einer Umgebung für dauerhaften Einsatz, ohne die SD-Karte zu ruinieren, und speichere die Daten auf einem Server. Auch die Oberfläche ist ordentlich.
https://elinux.org/RPi-Cam-Web-Interface
Für einen ähnlichen Zweck nutze ich https://github.com/TinkerTurtle/Sentry-Picam mit großem Erfolg.
Den Ordner mit aufgezeichneten Bildern/Videos synchronisiere ich mit syncthing auf drei weitere Rechner, um Redundanz zu haben, und ich habe ein Push-Benachrichtigungsskript auf Basis von
sendxmppangebunden, damit ich auf allen Geräten in Echtzeit benachrichtigt werde, wenn etwas passiert.Ziemlich cool. Ich habe früher bei https://securade.ai an etwas Ähnlichem gearbeitet und dafür Nvidia Jetson als Edge-Gerät verwendet.
Jetzt bin ich gespannt auf reCamera: https://www.seeedstudio.com/blog/recamera/