Vidéosurveillance à la maison
Pour ceux qui ont un serveur à la maison, il s’agit souvent de portables recyclés avec une webcam dans l’écran, ou alors vous avez sûrement une vieille webcam moisie qui traîne dans un coin de votre grotte. C’est mon cas également! J’ai donc décidé de réutiliser ce vieux matos pour me faire un petit système de vidéosurveillance dans le salon (oui il y a des méchants vilains qui ont essayé de forcer ma porte :-[).
Pour réaliser notre bidouillage, on a besoin d’une webcam, d’un serveur, et d’un stockage distant. Là on a le choix, soit un NAS bien caché, ou un disque dur bien planqué lui aussi (il ne faut pas qu’il se fasse voler), ou alors un autre serveur sur un site distant (plus dur déjà, mais on pourrait réaliser le montage a deux et s’entre-enregistrer par exemple). Au niveau logiciel, il nous faut VLC et une bonne distrib (j’ai pris Debian).
Je rassure de suite les ayatollahs de la ligne de commande (dont je fais partie), on peut installer vlc sans interface graphique; il suffit d’installer le paquet vlc-nox. Je vous laisse gérer l’installation sur votre distrib et on va passer à la partie intéressante, faire marcher le truc.
VLC est à la base un serveur de streaming; en conséquence il peut tourner en tant que daemon, ce qui nous intéresse. La partie relativement ardue est donc de lui faire lire la webcam et cracher ses bits quelque part. Ensuite il faudra aussi faire en sorte que n’importe qui ne puisse pas regarder notre flux (un peu de vie privée ne nuit pas) si on le sort sur http. Je vais aussi montrer comment sauvegarder dans un fichier directement.
Les webcams sont d’habitude supportées par v4l ou v4l2, et disponibles en tant que /dev/video*
. Vous devriez la voir rapidement. La mienne s’appelle /dev/video1
, donc je l’utiliserais dans les exemples ci-après.
On va commencer par le plus simple, qui est d’enregistrer le flux dans un fichier. Les webcams sortent d’habitude du MPEG, ce qui ne nous dérange pas, on va enlever le son et réduire un peu les FPS (10 images/s devraient suffire), on ne transcode pas histoire d’économiser du CPU et on garde la résolution de la webcam parce qu’on a d’habitude de la place sur le disque dur. La ligne de commande correspondante est:
vlc -I dummy "v4l2:///dev/video1:fps=10" --sout '#file{dst=/monBeauDossier/surveillance.mpg}' --daemon
Voilà à présent vlc va enregistrer tout ce que voit votre webcam dans le fichier /monBeauDossier/surveillance.mpg
. Bien sûr il peut s’agir d’un partage smb ou nfs depuis un NAS ou autre. Mais on peut aussi streamer le flux directement sur HTTP et l’enregistrer ailleurs, ce qui a l’avantage de mettre les enregistrements hors d’atteinte de intrus:
vlc -I dummy "v4l2:///dev/video1:width=320:height=200:fps=5" --sout '#standard{access=http,mux=ts,dst=:8000}' --daemon
Cette fois-ci j’ai réduit la résolution de la vidéo à 320×200, et diminué les images par seconde à 5, ce qui permet de conserver beaucoup de bande passante. L’accès HTTP se fait sur port 8000, et vous pouvez tester directement avec un lecteur vidéo quelconque (comme VLC tiens). N’oubliez pas de forwarder le port sur votre routeur ADSL (pour les malheureux en IPv4).
Ceci pose un autre problème étant donné que n’importe qui peut voir le flux. J’ai cru voir une espèce d’astuce pour faire un flux RTSP avec mot de passe dans VLC, mais je n’y suis pas arrivé. J’ai donc opté pour une approche plus simple: n’autoriser qu’une IP sur le port 8000. J’utilise UFW donc je vous montre comment je fais. À vous d’adapter à votre installation:
# ufw allow proto tcp from XXX.XXX.XXX.XXX to any port 8000 Rule added # ufw status Status: active To Action From -- ------ ---- 8000/tcp ALLOW XXX.XXX.XXX.XXX
Remplacez « XXX.XXX.XXX.XXX » par votre IP distante bien entendu.
Bon courage pour le reste de l’après-midi!
Image par whatleydude, CC-by