Cela fait des années que je bricole des Raspberry et plusieurs modules vidéos.
La performance est parfois limitée pour faire de la vidéo surveillance. Mais cette fois-ci j’ai enfin une installation centralisée qui fonctionne et qui permet de ne pas surcharger des raspberryPi !
Introduction
Les modules camera sur les RaspberryPi sont devenus assez nombreux, et pas mal d’outils existent aujourd’hui pour jouer avec.
Je suis tombé il y a quelques années sur un outil web qui s’appelle “MotionEye” et que je vous recommande vivement d’essayer. Il est développé par Calin Crisan : https://github.com/ccrisan/motioneye
Il permet d’avoir une interface web de gestion et d’affichage de caméras, et, se basant sur Motion, de prendre des photos ou des vidéos lorsque des mouvements sont détectés.
Il offre même une image pour SD directement prévue pour les Raspberry, et qui rentre dans un mouchoir de poche. Il prend nativement en charge les modules caméras des Raspberry, et des caméras IP selon divers protocoles (RTSP, MPEG, etc..) MotionEye permet aussi d’en gérer plusieurs en simultané.
Problèmes immédiats
Le HIC : les raspberry, c’est vraiment top. Mais quand il s’agit de faire du traitement via CPU, on est vite limités, ils ne sont pas fait pour ça (ou alors avoir un pi4, mais la consommation et la température posent d’autres problèmes).
Je possède par exemple un Pi0W. Il comprend 512Mo de RAM, un cpu 1Ghz avec un seul coeur, une carte wifi intégrée, et j’y ai rajouté un module caméra grand angle. Pour afficher une vidéo de la camera, si on utilise bien le GPU, pas de soucis. Mais dès qu’il faut faire du traitement CPU, c’est évident qu’il n’est pas fait pour ça, et provoque directement une surcharge CPU, rendant le tout inutilisable.
Sur un Pi2, cela fonctionne de manière très correcte.
Deuxième problème, toutes les photos/vidéos que l’on pourrait enregistrer vont se retrouver sur chacun des raspberry, ce qui n’est pas très pratique, même si motionEye donne des possibilités de pousser les fichiers en externe (ftp ou autre). Dans tous les cas, la carte SD du Raspberry va souffrir, et il faudra prévoir suffisamment de place.
Du coup comment faire ?
On pourrait faire un MotionEye “serveur”, qui tape sur des MotionEye “enfants”. C’est possible et géré nativement. Le problème c’est que cela ne déporte pas la charge CPU sur le serveur, ni le stockage des medias. Ceci ne s’implifie que la configuration des caméras qui se retrouve centralisée.
Je me suis dit, la meilleure solution, ce serait de déporter le serveur MotionEye, et de lui dire juste d’afficher des caméras via un flux réseau, comme une caméra IP du commerce.. mais avec des Raspberry ! Ceci permettrait aussi de gérer le stockage des médias sur une même machine, et de charger cette machine plutôt que les Raspberry pour la détection de mouvement et enregistrement.
C’est parti donc les grosses galères pour trouver une solution fonctionnelle, et assez fluide pour créer un flux vidéo sur les Raspberry, en tirant parti du GPU, pour ne pas coller le CPU au plafond… Je vous épargne les journées de bricolage à essayer plein de technos, et à tomber sur des soucis multiples.
Mais la solution est trouvée, elle s’appelle v4l2rtspserver
, et franchement merci à son développeur !
Le matériel
Pour créer mon infra de vidéo surveillance, j’ai eu besoin :
- d’une VM sur mon infra, avec une config assez basique pour l’instant (2 vcpus, 1Go RAM, 10Go SSD), sous Debian 10
- d’un ou plusieurs raspberry avec module caméra, et un RaspberryPiOS installé (raspbian en minimal, pas de desktop)
Bien sûr, le sujet de l’article parlait de Raspberry, on pourrait tout autant faire le serveur MotionEye sur un raspberry ;) Mais prévoyez au moins un pi3-pi4…
La préparation
Serveur centralisé
Sur le serveur Debian, il suffit d’installer MotionEye. Pour cela, rien de plus simple, c’est très bien détaillé sur le Wiki de l’appli : https://github.com/ccrisan/motioneye/wiki/Install-On-Debian
Par défaut l’application écoute sur le port 8765 en http. Bien sûr je vous conseille de passer le tout en HTTPS et de changer le port. Pour ma part tout sera derrière mon reverse proxy, mais ce n’est pas le but de ce tuto :p
Les Raspberry
Prérequis
Installez RaspberryPiOS (anciennement Raspbian) sur votre Pi. Pensez à (via raspi-config) :
- le mettre à jour
- activer le module camera
- changer le compte pi
- mettre la bonne locale, timezone, heure…
- le mettre sur le réseau !
Installation de v4l2rtspserver
Ensuite, il n’y a qu’à installer v4l2rtspserver.
Installez les prérequis pour le compiler (vous pourrez les enlever après) :
apt install cmake liblog4cpp5-dev libv4l-dev git
Puis on clone le dépôt :
git clone https://github.com/mpromonet/v4l2rtspserver.git
Dans le dossier, on va compiler le tout :
cmake .
make
Vous pouvez compiler sur plus de CPU selon le raspberry (make -jX
, où X = nombre de cpus +1).
Là je vous le dis, si vous ne le faites pas sur un pi2 au moins, vous pouvez faire un tour :D
Enfin, on installe :
make install
Vous pouvez si vous le souhaiter supprimer le dossier, et enlever les prérequis précédemment installés.
Lancement
Je vous invite à tester la commande avant de créer le service.
La syntaxe est simple, mais je vous invite à faire un -h
.
En gros :
v4l2rtspserver -P port -U login:mdp -W largeur -H hauteur -F fps /dev/videoX
Par exemple :
v4l2rtspserver -H 1200 -W 1600 -F 10 -P 8888 -U unsupercompte:unsupermotdepasse /dev/video0
Vous pouvez utiliser VLC pour se connecter au flux (rtsp://ipdurasp:port/unicast).
Service
Quand vous avez les arguments qui vous vont, on peut configurer le service.
Il suffit d’éditer le service systemd : /usr/lib/systemd/system/v4l2rtspserver.service Modifiez la ligne du “ExecStart” :
ExecStart=/usr/local/bin/v4l2rtspserver -H 1200 -W 1600 -F 10 -P 8888 -U unsupercompte:unsupermotdepasse /dev/video0
On active et on start le service :
systemctl enable v4l2rtspserver
systemctl start v4l2rtspserver
Et c’est parti !
Au final
Sur un Pi2, la charge sur le module camera est à peine à 0.30. Sur le pi0, la charge ne dépasse pas 0,5 ; c’est top ! Niveau latence, il y a environ 1 à 3 sec de décalage, ce qui est franchement correct.
La bande passante sur du 1600x1200 en 10fps est d’environ 3Mb/s, ce qui est raisonnable même pour un wifi :p
Configuration de MotionEye
Rajout des caméras
Pour ajouter une caméra de v4l2rtspserver, il suffit dans MotionEye, de suivre ces étapes.
MotionEye vous proposera ensuite un choix de flux dans la liste déroulante à sélectionner. Validez, et allez faire un tour dans “Video Device” pour pouvoir changer
- le nom de la camera
- la résolution par ce que vous avez indiqué dans la configuration de v4l2rtspserver
- la rotation si besoin
- le framerate
Et voilà :)
Et plus si affinités
Vous pouvez maintenant jouer avec les options de MotionEye pour définir d’enregistrer des photos, vidéos, faire de la détection de mouvement, du streaming etc…
Egalement, sachez qu’une application Android existe… et ça c’est un plus.