Une fausse caméra Linux

Retour à la page Systèmes

Motivation

Le confinement a provoqué un regain d’intérêt pour les visioconférences. Mais si vous n’avez pas (ou ne souhaitez pas avoir) de caméra, vos interlocuteurs peuvent trouver frustrant de ne rien voir venant de vous.

C’est ainsi qu’est venu le besoin de «créer» une caméra virtuelle, qui redirigerait une partie de l’écran vers mes interlocuteurs, pour leur montrer ou bien une photo, ou bien un document en fonction de l’humeur.

Prérequis

  • les sources du projet v4l2loopback qui assure l’essentiel de la magie;

  • un noyau Linux suffisamment récent, et les en-têtes (package kernel-devel pour ma distribution) qui vont avec;

  • (option) le package ffmpeg que j’utilise pour jouer avec cette «caméra» une fois qu’elle sera créée;

Mode d’emploi

Charger les sources, compiler puis charger le module noyau:

make
sudo make install
sudo modprobe v4l2loopback   # crée /dev/video0

Fournir une image (ici un coin d’écran) au périphérique créé:

# Utiliser ffmpeg pour envoyer une capture à /dev/video0
ffmpeg -f x11grab -r 15 -s 1280x720 -i :0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0

Contrôler ce que voit votre caméra virtuelle:

# Capturer l’image pour voir contrôler le résultat
ffplay /dev/video0

La commande la plus complexe était donc celle qui capture la video pour la caméra. Le manuel ffmpeg explique les options:

  • -f x11grab : [format]

  • -r 15 : [rate] Nombre d’images par seconde

  • -s 1280x720 : [size] Taille de l’image, à partir du coin supérieur gauche

  • -i :0 : [input] Fournisseur de l’image. Ici écran 0 de X11

Problèmes et compléments

Si on met à jour le noyau de Linux, il faut recompiler et réinstaller.

Les packages systèmes complémentaires:

  • v4l2-ctl : fourni par v4l-utils

  • v4l2loopback-ctl : comme le make ci-dessus, mais avec make install-utils

Problèmes et bugs:

  • pour des résolutions > 1280x720, les couleurs sont perturbées; - il faut peut-être utiliser v4l2loopback-ctl comme indiqué dans le README.md (je n’ai pas creusé);

Pour aller plus loin

Cette petite présentation est très largement inspirée des articles suivants: