Ceci est une ancienne révision du document !
Table des matières
Webcam streaming (avec ffmpeg)
Dans mon travail, on utilise souvent de vieux équipements basés sur des OS qui ne sont plus maintenus (coucou Windows XP!), et qu'il serait dangereux de connecter à internet. Pourtant, nous avons besoin de savoir ce qu'il se passe sur l'ordinateur sans être constamment devant. La solution la plus simple qui nous est venue est de brancher une webcam devant l'écran et de streamer le tout sur un serveur web moderne (et sécurisé).
La première solution que nous avons employée est MotionEye, notamment dans sa version OS pour Raspberry pi.
ça fait 5 ans qu'on l'utilise, on peut dire que c'est plutôt pas mal, même si ça repose sur une succession d'images fixes balancées vers le navigateur.
Mais, il y a un mais, ça ne fonctionne pas toujours. Et on ne sait pas pourquoi. Boot, marche pas, reboot marche pas, reboot marche pas, reboot marche.
On s'est donc penché sur une autre solution, basé sur du streaming de vraies vidéos. L'idée est que, de nos jours avec toutes ces visios, “on” doit pouvoir maîtriser les flux vidéos.
Qui dit stream vidéo, dit ffmpeg (surtout sur une base linux). En vrai, ça n'a pas été si facile que ça, mais au final ça marche et la solution est assez élégante.
Allez, je vous montre comment on a fait.
Matériel
- Un raspberry pi sous Raspberry pi OS (on vise la compatibilité avec le hardware et la dispo des softwares)
- Une webcam branchée en USB
- Une connexion ethernet (le cuivre, y'a que ça de vrai)
- (facultatif) un serveur web pour centraliser plusieurs Rpi+webcam
Installation du Raspberry Pi
On aura un usage headless, or les versions “modernes” de Raspberry pi OS n'incluent pas de ssh par défaut, ni d'utilisateur avec login/mdp. Il faut les gérer au premier démarrage… ou rajouter des petits fichiers sur la partition boot
avant le premier démarrage. J'ai noté ici comment faire.
Vérification des caméras connectées
On utilise le paquet v4l-utils
, préinstallé.
Il fournit la commande v4l2-ctl –list-devices
, on obtient qque chose dans le genre :
user@raspberrypi:~ $ v4l2-ctl --list-devices bcm2835-codec-decode (platform:bcm2835-codec): /dev/video10 /dev/video11 [...] /dev/media2 bcm2835-isp (platform:bcm2835-isp): /dev/video13 /dev/video14 [...] /dev/media0 /dev/media1 # et si la caméra webcam est branchée Microsoft® LifeCam Studio(TM): (usb-3f980000.usb-1.1.3): /dev/video0 /dev/video1 /dev/media3
Les bcmm2835 ne nous intéressent pas, il s'agit probablement de la gestion de la caméra par le connecteur CSI (nappe). La webcam que nous avons est bien de marque Microsoft, et elle est branchée en USB. C'est donc ce dernier bloc qui nous intéresse.
⇒ On apprend qu'elle accessible par /dev/video0
.
Amélioration WebRTC
On peut lire un peu partout que WebRTC est un protocole moderne (post-covid) qui gère la transmission de flux vidéo avec des latences sub-seconde, et pris en charge nativement par les navigateurs web modernes.
Ce serait donc une solution intéressante pour améliorer notre solution qui souffre d'une latence entre 5 et 10 secondes, et qui nécessite une librairie JS côté client.
Liens (pas testés):
Autre solution : le streaming d'images fixes
Je note ici en vrac des pistes que nous avons abordées, puis