Caméra de sécurité open source basée sur Raspberry Pi
(github.com/TzuHuanTai)- Raspberry Pi WebRTC est un projet basé sur C++20 qui transforme un Raspberry Pi ou un NVIDIA Jetson en plateforme de streaming WebRTC avec une latence d’environ 200 ms
- Il utilise WebRTC natif et prend en charge l’encodage matériel/logiciel, les instantanés, l’enregistrement, la diffusion, le contrôle à distance et la messagerie IoT via WebRTC DataChannel
- Les modes de signalisation pris en charge sont MQTT, WHEP et WebSocket ; MQTT sert à l’échange des informations de connexion WebRTC entre la caméra Pi et les clients
- Les appareils pris en charge sont les Raspberry Pi Zero/3/4/5 et NVIDIA Jetson Nano/NX/Orin ; les caméras peuvent être CSI ou USB et doivent prendre en charge libcamera, libargus ou V4L2
- Sur un Pi 5 ou un appareil sans encodeur matériel, il faut retirer
--hw-acceldes options d’exécution ; WHEP ne nécessite pas de broker, mais requiert un nom d’hôte public
Présentation du projet
- Raspberry Pi WebRTC est un projet qui transforme un Raspberry Pi ou un NVIDIA Jetson en plateforme de streaming WebRTC à faible latence
- La latence cible annoncée est d’environ 200 ms
- Les principales technologies indiquées sont les suivantes
-
libwebrtc m146.7680
-
C++20
- Licence Apache 2.0
-
Fonctionnalités prises en charge
- Fournit un streaming basé sur WebRTC natif
- L’encodage vidéo prend en charge l’encodage matériel et l’encodage logiciel
- Les fonctions caméra incluent les instantanés, l’enregistrement et la diffusion
- Prend en charge le contrôle à distance et la messagerie IoT via WebRTC DataChannel
Signalisation et clients
- Prend en charge la signalisation MQTT
- Prend en charge la signalisation WHEP
- Prend en charge la signalisation WebSocket
- picamera.js : signalisation SFU et diffusion
Prérequis
- Les cartes prises en charge sont Raspberry Pi Zero/3/4/5 ou NVIDIA Jetson Nano/NX/Orin
- Il est possible d’utiliser une caméra CSI ou USB
- L’entrée caméra doit prendre en charge libcamera, libargus ou V4L2
Démarrage rapide sur Raspberry Pi
- Installer Raspberry Pi OS
- Flasher Lite OS sur une carte SD avec Raspberry Pi Imager
- Installer les dépendances
- Installer
libmosquitto1,pulseaudio,libavformat61,libswscale8,libyaml-cpp0.8
- Installer
- Télécharger le binaire
- Télécharger le dernier release binary et le décompresser
- Signalisation MQTT
Mode d’exécution et points d’attention
- Ouvrir picamera-web, ajouter la configuration MQTT, puis générer un
UID - Sur le Pi, exécuter
./pi-webrtcen indiquant en options la caméra, les FPS, la résolution, l’hôte MQTT, le port, le nom d’utilisateur, le mot de passe, l’UID, etc. - Les options d’exemple incluent
--camera=libcamera:0,--fps=30,--width=1280,--height=960,--use-mqtt,--no-audio, etc. --hw-accelest l’option à ajouter pour utiliser l’encodage matériel sur Pi Zero 2W, 3B, 4B- Sur un Pi 5 ou un appareil sans encodeur matériel, il faut retirer
--hw-accel
Utilisation avancée
- Diffuser un live stream à plus de 1 000 spectateurs via un SFU
- Utiliser le pilote V4L2 : pour les caméras USB
- Exécuter comme service Linux
- Enregistrement
- Communication audio bidirectionnelle
- Messagerie DataChannel bidirectionnelle
- Streamer un flux IA ou personnalisé vers une caméra virtuelle
- Utiliser WHEP avec un proxy Nginx
- Utiliser WebRTC Camera dans Home Assistant
1 commentaires
Avis sur Hacker News
Il y a quelque temps, je devais surveiller à distance une maison en rénovation. J’ai essayé d’installer un système de sécurité très présent dans les pubs, recommandé par des connaissances, mais ce n’était pas donné, et ce n’est qu’au moment de la configuration que j’ai découvert que la plupart des fonctions voulues exigeaient une connexion Internet haut débit.
Cette condition n’apparaissait nulle part dans les documents marketing, la maison n’avait pas Internet, et je n’avais pas l’intention de payer au moins 60 $ d’Internet en plus des 40 $ par mois du système de sécurité.
À la place, j’ai branché une caméra Raspberry Pi sur un RPi Zero 2W que j’avais déjà, puis j’ai acheté un hotspot LTE et une SIM prépayée T-Mobile à 5 $ par mois.
Côté logiciel, avec imgcomp, je prenais une photo chaque seconde et l’enregistrais sur un disque RAM ; si deux photos différaient autrement que par du bruit, le Pi envoyait la photo modifiée dans un répertoire sur un VPS, ce qui déclenchait Gotify pour m’envoyer une notification sur mon téléphone avec un lien vers la photo.
Dans l’ensemble, c’était une installation à la Rube Goldberg, mais elle a fonctionné presque parfaitement pendant des années.
J’avais commencé à fabriquer quelque chose de similaire il y a quelque temps : https://youtube.com/watch?v=5E7_40PWqiQ
Je vivais en appartement pendant la construction de ma maison, et je voulais faire une vidéo en timelapse avec la caméra, tout en me permettant en plus d’y accéder par Internet pour voir comment les ouvriers s’en sortaient.
Malheureusement, chaque idée qui me venait à l’esprit avait déjà été réalisée par quelqu’un, en l’occurrence en Chine. Sur AliExpress, on trouve des caméras plutôt correctes qui font ça et plus encore, avec une finition meilleure qu’un boîtier bricolé en impression 3D.
Mon rêve serait de fabriquer ce genre d’appareil et de permettre l’accès distant via Tor. On pourrait ainsi le garder entièrement en local tout en y accédant à distance depuis n’importe où dans le monde.
Un projet alternatif que je regardais pour l’utiliser sur un Raspberry Pi Zero WH est mediamtx.
https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras
C’est un bon exemple d’utilisation de WebRTC, et bizarrement WebRTC reste assez sous-exploité.
Pour l’auto-hébergement avec un accès distant au serveur de signalisation via données mobiles, il peut falloir configurer du DDNS et de la redirection de ports si le FAI fournit une IP dynamique.
Mais cette approche expose le serveur à Internet. À la place, on peut utiliser une solution open source qui crée une connexion privée entre le Pi et le serveur. Ainsi, il n’est pas nécessaire d’ouvrir l’accès réseau au serveur, ni d’avoir une IP statique ou de la redirection de ports.
Je suis curieux de savoir pourquoi, selon vous, WebRTC a eu du mal à s’imposer largement. Est-ce une question de qualité logicielle, de ressources pédagogiques ? Je cherche toujours de nouveaux projets.
Je ne comprends pas bien le fait que le Raspberry Pi 5 ne prenne pas en charge l’encodage matériel v4l2. Ils ont fait tant d’efforts pour intégrer le décodage vidéo ; pourquoi ne pas avoir d’encodeur ?
L’encodage et le décodage ont des parties communes, mais quand je travaillais sur le codec Opus, il y avait tout de même pas mal de code propre à un seul des deux chemins.
C’est exactement ce que je cherchais. Je voulais faire tourner de la détection de personnes.
J’utilise yolov3-tiny : ce n’est pas le plus récent, mais c’est un modèle de machine learning en vision par ordinateur très léger, et je suis en train de maximiser les performances d’inférence en C++ pour faire de la détection de personnes en temps réel autour de la maison.
J’aimerais que, si quelqu’un entre sur le terrain la nuit, une sirène et des lumières s’allument automatiquement pour faire fuir l’intrus.
https://github.com/jmaczan/yolov3-tiny-openvino
J’ai imaginé une approche où les lumières et la sirène s’activent progressivement à mesure que la personne approche. On pourrait ainsi réagir beaucoup plus tôt tout en donnant au potentiel intrus suffisamment de signaux pour faire demi-tour.
Faire monter progressivement l’adrénaline dans une boucle de rétroaction me semble plus efficace. Un effet soudain ne demande qu’une seule décision.
J’ai récemment fabriqué un enregistreur audio toujours allumé. Son objectif principal est d’enregistrer l’audio en continu ; ce n’est pas destiné à la surveillance, mais aux musiciens et créateurs qui ne veulent pas devoir penser à appuyer sur le bouton d’enregistrement au milieu d’une excellente performance.
J’ai utilisé un Zero-W, un script shell un peu délicat autour de
arecord/aplay, et un frontend turboLua ; ça fonctionne plutôt bien.L’enregistrement est continu, mais l’audio « ancien » est supprimé uniquement une fois dépassée la durée de conservation choisie par l’utilisateur, avec des options de 1 minute, 5 minutes, 15 minutes, 30 minutes, 1 heure, 3 heures, 5 heures et 24 heures.
J’ai aussi créé un frontend qui permet à l’utilisateur de garder la plage horaire où il estime avoir capturé quelque chose de bon. Cette heuristique ressemble au mécanisme d’homme mort/caméra de sécurité de nombreux produits de surveillance.
Ça fonctionne tellement bien que je me demande pourquoi ce n’est pas encore devenu une sorte de standard. Il semble rester une préférence économique pour ne pas remplir le stockage, mais aujourd’hui 128 Go tiennent déjà assez longtemps.
J’ai l’impression que cette approche finira un jour par se généraliser. On l’installe, on l’oublie, puis après plusieurs heures de jam, on revient chercher uniquement ce qu’on veut conserver et le reste se nettoie tout seul ; c’est assez inspirant.
Il ne faut pas oublier l’ancien projet RPi Cam Web Interface. Il date un peu, mais il tourne encore sur mes Pi.
Il est conçu pour fonctionner en continu sans massacrer la carte SD, avec le stockage envoyé vers un serveur. L’interface est propre aussi.
https://elinux.org/RPi-Cam-Web-Interface
Pour un usage similaire, j’utilise avec beaucoup de succès https://github.com/TinkerTurtle/Sentry-Picam.
Je synchronise le dossier des images/vidéos enregistrées avec trois autres machines via syncthing pour assurer la redondance, et j’ai ajouté un script de notifications push basé sur
sendxmppafin de recevoir des alertes en temps réel sur tous mes appareils quand quelque chose se passe.Plutôt cool. J’ai déjà travaillé sur quelque chose de similaire chez https://securade.ai en utilisant un Nvidia Jetson comme appareil edge.
Maintenant, j’attends reCamera avec impatience : https://www.seeedstudio.com/blog/recamera/