Table des matières

Enregistrer depuis une webcam sous Debian GNU/Linux

Sources :

Cas d'utilisation

Je souhaite enregistrer les flux vidéo et audio fournis pas une webcam Aukey PC-LM1E, sous Debian 11 KDE tournant sur un ordi équipé d'un processeur i3-12100, sans autre processeur graphique que l'UHD Intel® 730 intégré au processeur.

Autant le dire tout de suite, dans mon cas, la solution à tous les problèmes s'est appelée guvcview.
# apt install guvcview

Suivi de :

$ guvcview

J'ai eu facilement accès à tous les réglages, pu faire tous tests souhaités afin de tirer le meilleur de ma webcam (en l’occurrence du 1080p à 30fps), tout en définissant le format et les paramètres d'enregistrement que le voulais. En 2 clics, j'ai pu choisir un autre micro que celui de la webcam. Le tout, avec des menus déroulant simples ou ne s'affichent que des valeurs applicables.

Ce programme a instantanément reconnu tous les périphériques connectés susceptibles de fournir de la vidéo1) ou du son.

Mon choix

Détection vidéo

Dans mon cas d'utilisation, cette webcam s'est montrée plug and play, aussi bien sous Debian 10 qu'avec une installation (à partir de rien) de Debian 11. Elle était immédiatement utilisable pour des visios Jitsi à travers Firefox, son et image. C'est un moyen rapide de tester la détection et l'utilisabilité mais ça a été un peu plus compliqué lorsqu'il s'est agit d'enregistrer les flux.

Périphériques USB détectés

Pour avoir une chance d'être exploitable, la présence d'un périphérique USB doit avoir été détectée par le système.

$ lsusb

Affiche la liste des périphériques détectés, un clavier, une souris, une webcam, un micro autonome, un adrophone… Si la webcam ne figure pas dans la liste, inutile d'aller plus loin.

Dans mon cas, ma webcam est reconnue en tant que périphérique USB :

Bus 001 Device 008: ID 0c45:636d Microdia PC-LM1E

Quelques outils

En ligne

Ces outils fonctionnent sur le principe du test initial que j'ai réalisé via un serveur Jitsi et Firefox. Ils consistent à se connecter à un serveur et partager la caméra et le micro. La demande de partage affiche une liste de périphériques ce qui permet de voir le nom utilisé par le système pour désigner la webcam (par exemple : “PC-LM1E: PC-LM1E”.

Il faut toutefois souligner que ces tests se font en local sur l'ordi2). Ça tombe bien puisqu'on veut effectuer un enregistrement en local et non avoir une conversion en viso ;-)

webcamtests.com

Webcam Test permet de tester le signal vidéo. Il affiche un retour image, procède à une série de tests (plusieurs secondes) dont il affiche les résultats complets. Le mode “full screen” permet d'apprécier la qualité de l'image.

Dans mon cas d'utilisation, il signale que la caméra n'a pas de microphone intégré alors qu'elle dispose d'un micro stéréo.

Mic Test permet de tester le signal audio. Il s'est avérée incapable de détecter le micro de la webcam ainsi que d'autres sources audio : l'audio interne de l'ordi ou le micro raccordé en face avant3). Il a miraculeusement reconnu un autre micro USB à partir duquel j'ai pu poursuivre le test.

Il affiche une vue temporelle spectrale du signal et procède à une série de tests dont il affiche les résultats. Durant les tests, il procède à un enregistrement que l'on pourra lire, une fois les tests terminés. Cela permet de constater auditivement la qualité du signal.

Pas de panique, l'outil suivant a fonctionné ;-)
onlinemictest.com

Webcam Test permet de tester le signal vidéo. Il affiche le nombre d'images par secondes mais pas la résolution.

Microphone Test permet de tester le signal audio. Présente le résultat sous forme signal de type oscilloscope. C'est rudimentaire mais efficace. Cela permet de vérifier la détection ou non du micro (en tout ou rien). On a également une idée du bruit de fond 4).

Interface graphique

qv4l2

qv4l2 est vraiment très informatif pour peu que la webcam soit prise en charge par v4l25) On retrouve le même type d'interface que pour la configuration de l'excellent guvcview mentionné d'entrée de jeu.

On choisit le format, la taille et il calcule la vitesse d'affichage. On peut lancer un rendu à l'écran de ce que ça donne. Dans mon cas, il a reconnu les 2 flux. En choisissant le flux mjpeg, j'arrivais logiquement à 30 fps en 1920×1080.

Il affiche directement les caractéristiques de la première webcam détectée. On peut en choisir une autre : File > Open device, puis naviguer vers /dev et choisir le nom du “device” (qu'indique gst-device-monitor-1.0 ;-) ).

En ligne de commande

Formats du signal et résolutions

gst-device-monitor-1.0 est un outil simple et efficace qui détecte les webcam reconnue par gstreamer (v4l ou pas). L'affichage des résultat est d'une très grande clarté.

Dans mon cas il a reconnu ma webcam récente et ma webcam antique, ainsi que tous les formats et encodages fournis par ces deux webcam. Pour l'installer :

# apt install gst-device-monitor-1.0

Pour l'utiliser, aucun paramètre n'est nécessaire :

$ gst-device-monitor-1.0

Goûter les résultats :-) Dans mon cas, je retrouve les promesses du fabricant :-D

Ça se complique car il faut connaître le nom interne donné par le système à la caméra. En effet, ce nom c'est pas celui qui est proposé dans la liste déroulent de Firefox. Heureusement, dans la plupart des cas, se nom sera “/dev/video0”.

ffmpeg avec les bons paramètres affiche ces informations.

ffmpeg -list_formats all -i /dev/video0

Dans mon cas, cela affiche :

[video4linux2,v4l2 @ 0x560087413280] Compressed:       mjpeg :          Motion-JPEG : 1280x720 1920x1080 800x600 640x480 352x288 320x240
[video4linux2,v4l2 @ 0x560087413280] Raw       :     yuyv422 :           YUYV 4:2:2 : 1920x1080 1280x720 800x600 640x480 352x288 320x240

Quasiment les mêmes résultats que gst-device-monitor-1.0, présentés autrement. Mais faut connaître les nom de “devices” pour avoir toutes les webcam.

ffplay permet d'avoir un rendu visuel du flux tout en affichant les caractérisques de ce qui est joué.

Dans mon cas, il récupère manifestement le second flux détecté par ffmpeg, non compressé et fatalement lentissime (à 5fps !) :

$ ffplay -fflags nobuffer -flags low_delay -framedrop -i /dev/video0
[…]
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 165888 kb/s, 5 fps, 5 tbr, 1000k tbn, 1000k tbc

mpv donne a peu près le même genre d'info. Dans mon cas, je retrouve les mêmes mauvais résultats puisqu'il reste, lui aussi, scotché sur le flux non compressé.

$ mpv --profile=low-latency --untimed /dev/video0
[…]
(+) Video --vid=1 (rawvideo 1920x1080 5.000fps)
[autoconvert] Converting yuyv422 -> yuv422p
VO: [gpu] 1920x1080 yuv422p
Informations techniques

v4l2-ctl permet de récupérer des caractéristiques techniques de webcam.

ffmpeg -list_formats all -i /dev/video0

Dans mon cas, il a bien détecté la Aukey PC-LM1E mais pas ma vieille Logitech6), pourtant proposée via Firefox sur les outils en ligne… À titre d'exemple, voici les informations renvoyées dans mon cas :

$ v4l2-ctl -D
Driver Info:
        Driver name      : uvcvideo
        Card type        : PC-LM1E: PC-LM1E
        Bus info         : usb-0000:00:14.0-7.1
        Driver version   : 5.18.16
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format

Problèmes et pistes de solutions

Les applications choisissent le mauvais encodage

Dans mon cas, les applications privilégient le flux non compressé. Une piste est de créer un pseudo périphérique configuré comme le souhaite. C'est la solution suggérée dans un forum pour le régler le problème inverse7) : How to change mjpeg to yuyv422 from a webcam to a v4l2loopback?

L'état de l'audio n'est pas clair

Sous KDE, “Les paramètres de volume audio” donnent beaucoup d'information mais manquent de clarté.

Je préfère utiliser pavucontrol (Contrôle de volume PulseAudio). S'il n'est pas préinstallé :

# apt install pavucontrol.

Détection audio

Sources :

arecord
$ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 0: PCH [HDA Intel PCH], périphérique 0: ALC897 Analog [ALC897 Analog]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 0: PCH [HDA Intel PCH], périphérique 2: ALC897 Alt Analog [ALC897 Alt Analog]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 1: Microphone [USB Condenser Microphone], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
carte 2: PCLM1E [PC-LM1E], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0
Liste claire des sources audio disponibles
$ pacmd list-sources | grep -e 'index:' -e device.string -e 'name:'

Fournit la liste des sources et indique un manière de nommer les sources. Dans mon cas, il signal que “iec958:2” identifie ma webcam en tant que source audio et indique qu'elle présente un profile “iec958-stereo” :

    index: 1
        name: <alsa_input.usb-PC-LM1E_PC-LM1E_PC-LM1E-02.iec958-stereo>
                device.string = "iec958:2"

L' “*” indique le périphérique par défaut

Activation et niveau sonore

Le périphérique audio et son flux peuvent être parfaitement reconnus mais ne rien produire.

pavucontrol permettra de résoudre la plupart des cas : source rendue muette, application n'utilisant le bon périphérique d'entrée… Dans certains cas, il faut aller plus en détail et accéder à des informations masquées par pavucontrol.

Si le système est configuré pour utiliser Alsa8), alsamixer donne une vue plus détaillée de la configuration des “cartes” son :

$ alsamixer

Enregistrement

guvcview

Comme annoncé au début de cette fiche, guvcview est l'application qui m'a donné les meilleurs résultats, le plus vite. Il s'installe facilement mais ne crée pas de lanceur d'application, du moins dans Debian-11-KDE.

OBS

Obs-Studio a été la première application testée à me donner un bon résultat. Certes, OBS est conçu pour faire bien plus qu'enregistrer une webcam ; je me suis quand même lancée. J'ai obtenu un enregistrement à la qualité maximale de ma webcam.

L'ampleur des fonctionnalités rend la prise en main un peu plus longue, sans être difficile,. Il y a beaucoup de choses à paramétrer donc beaucoup d'écrans et de menus. Mais l'interface est claire et si l'on a du mal à trouver ce que l'on cherche on sait qu'on y est quand on l'a trouvé.

Pour enregistrer la webcam il faudra créer une source vidéo et une source audio.

La configuration de la source audio est relativement simple en choisissant le type “Entrée PulseAudio”. Le choix effectif de la source se fait en choisissant dans la liste des périphériques PulseAudio, proposés dans un menu déroulant. On peut choisir le micro de la webcam ou tout autre micro disponible.

Dans mon cas, la configuration de la source vidéo a été un peu plus compliquée car le paramètre d'encodage ne proposait pas mjpeg. Mais il proposait “YV12 (émulé)” qui avait les même performances (il m'a fallu tâtonner…).

La difficulté suivante est de ramener la taille de l'espace de travail (canevas) à définition qu'on a choisi pour la source vidéo. En effet, OBS est un studio avec plusieurs sources pouvant être combinée dans le flux de sortie, enregistré (notre cas) ou diffusé (le cas général).

Le réglage se trouve dans : Fichier > Paramètres > Vidéo. C'est l'occasion de choisir la définition de l'image de sortie. Dans notre cas, on choisira la définition de capture.

Si l'image déborde de la fenêtre, clic-droit sur l'aperçu > Mise à l'échelle de l'aperçu > Adapter à la fenêtre.

Il ne reste plus qu'à lancer l'enregistrement par un cli sur le bouton “Démarrer l'enregistrement”.

VLC

Présent dans la plupart des configuration standard sur un ordinateur “de bureau”9), ça a été mon premier choix.

Média > Ouvrir un périphérique de capture permet d'accéder à la configuration permettant de capture les signaux fournis par la webcam. C'est là que ça se corse… Ici, le flux vidéo est dénommé /dev/vidéo0 et me flux audio hw:x,y (par ex. hw:0,2).

Dans mon cas, VLC n'arrivait pas récupérer le flux vidéo compressé ce qui rendait l'acquisition extrêmement lourde. Les “options avancées” proposent bien de personnaliser les paramètres du configuration du pilote vidéo v4l2 mais dans un format qui suppose d'avoir digéré la 12 milliards d'options proposées et de ne pas se tromper dans la syntaxe imposée… J'ai lâché l'affaire en espérant trouver mieux.

Kdenlive

Certes, c'est un logiciel de montage mais il est également censé pouvoir récupérer le flux d'une webcam : Configuration > Configurer Kdenlive > Acquisition.

Dans mon cas, Kdenlive ne détecte aucun périphérique. L'écran de configuration de l'acquisition n'affiche pas le volet ffmpeg où le choix est censé se faire. Adieu le tout en un10) !

Cheese

J'en avais lu tellement de bien que ça a été mon deuxième choix. Dans mon cas, cette application a donné un résultat vraiment pourri : 640×480 flou. Mes différentes tentatives de jouer sur les paramètres de configuration n'ont rien donné.

Kamoso

Kamoso, prévu pour tourner sous KDE, n'a rien donné d'exploitable. Aussitôt installé, aussitôt désinstallé.

Vérifier l'enregistrement

Bien sûr, la vérification est avant tout visuelle et sonore.

On peut aussi vérifier l'encodage effectif des flux audio et vidéo.

$ ffprobe nom_du_fichier

vous dira tout.

1)
Pas de capture d'écran mais ce n'était pas le but.
2)
Ils s'exécutent à l'intérieur du navigateur, pas sur le serveur distant.
3)
Le changement de périphérique par défaut dans pavucontrol n'y change rien.
4)
Qui peut être réellement présent dans la pièce, non-filtré par le micro, généré par l'électronique du micro ou de l'ordi, ou généré numériquement par le pilote (driver) utilisé par le système.
5)
vidéo for linux.
6)
Dont ffmpeg m'a appris qu'elle fournissait du mjpeg : [video4linux2,v4l2 @ 0x5599662c3280] Compressed: mjpeg : JFIF JPEG : 320×240 640×480 !
7)
L'internaute veut accéder format non compressé alors que le système pousse le flux compressé…
8)
Advancde Linux Sound Architecture.
9)
Pas un serveur.
10)
C'est le logiciel de montage que j'utilise…