[Geek] Serveur centralisé de vidéo surveillance avec des RaspberryPi
@ Nicolas | Monday, Mar 1, 2021 | 6 minute(s) de lecture | Mise à jour le Sunday, Mar 21, 2021

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.

burn

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 !

Thanks

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

waiting

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-add-camera

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.

motioneye-screen

© 2017 - 2021 Some stuff...

Powered by Hugo with theme Dream.

Me

Nicolas.

Geek, photographe amateur à mes heures perdues, motard du quotidien. Je me passionne de tous les sujets autour de l’informatique depuis bien (trop) longtemps. Les années passent et d’autres passions s’ajoutent, disparaissent, évoluent.

Ce blog est donc mon mélange à moi de tous ces sujets.

Liens sociaux