86 votes

Comment vérifier les webcams disponibles à partir de la ligne de commande ?

Y a-t-il une commande de terminal qui répertorie toutes les webcams connectées à mon ordinateur, y compris celle native ? Peut-être en utilisant le paquet ffmpeg ?

144voto

v4l2-ctl --list-devices

sudo apt-get install v4l-utils
v4l2-ctl --list-devices

Exemple de résultat avec une seule caméra :

Integrated Camera (usb-0000:00:1a.0-1.6):
        /dev/video0

Testé sur Ubuntu 16.04.

video1 dispositif de métadonnées

Sur Ubuntu 19.10 Lenovo Thinkpad P51, cependant, il énumère deux appareils de ce type, video0 y video1 mais je n'ai qu'une seule caméra, et je ne peux voir que les images provenant de video0 avec ffplay . Cette question a été posée à :

Ce qui se passe, c'est que /dev/video1 contient une sorte de métadonnées vidéo seulement et non les images comme on peut le voir :

sudo v4l2-ctl --device=/dev/video0 --all
sudo v4l2-ctl --device=/dev/video1 --all

qui montre respectivement :

        Device Caps      : 0x04200001
                Video Capture 

        Device Caps      : 0x04a00000
                Metadata Capture

Comment voir l'image de la caméra en direct

Mon préféré :

sudo apt install ffmpeg
ffplay /dev/video0

enter image description here

Prendre une seule photo à partir de la ligne de commande

Prendre une photo à partir du terminal

ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -frames 1 out.jpg

Enregistrer une vidéo à partir de la ligne de commande

Paramètres choisis en fonction de "Comment obtenir les paramètres de la caméra comme la résolution" ci-dessous :

ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -c copy out.mkv

Ensuite :

ffprobe out.mkv

contient comme prévu :

Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)

Si vous choisissez de mauvais paramètres, la résolution peut être lente. La caméra produit déjà un format codé spécifique, et la façon la plus simple d'enregistrer est de copier ce format comme ci-dessus :

TODO Si je remplace -c copy out.mkv avec out.ogv pour essayer d'enregistrer directement dans un format ouvert (contrairement au MJPEG), j'ai obtenu une vidéo de faible résolution.

Capture interactive d'images/vidéos avec aperçu

Programmes de capture d'images et de vidéos

Jusqu'à ce que j'apprenne à courir ffplay prévisualisation sur un Shell et capture en même temps depuis un autre Shell avec ffmpeg (ils se battent pour l'appareil vidéo), je vais devoir m'abaisser à cet étonnant programme GUI :

sudo apt install cheese

enter image description here

Lire les données de la caméra à partir de C/C++

https://stackoverflow.com/questions/4290834/how-to-get-a-list-of-video-capture-devices-web-cameras-on-linux-ubuntu-c

Un exemple concret en C++ qui traite les images de la caméra sur le GPU avec OpenGL et les montre en direct : https://stackoverflow.com/questions/13693946/image-processing-with-glsl-shaders/40641014#40641014

enter image description here

Comment obtenir les paramètres de la caméra comme la résolution

produit de bonnes informations :

ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    [0]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 320x180
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 424x240
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 848x480
            Interval: Discrete 0.050s (20.000 fps)
        Size: Discrete 960x540
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.100s (10.000 fps)
    [1]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 320x180
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 320x240
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 352x288
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 424x240
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 640x360
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 848x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 960x540
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.067s (15.000 fps)

Comment obtenir les encodages ffmpeg correspondants ?

v4l2-ctl --list-formats-ext donne le nom du noyau Linux des choses, par exemple . YUYV 4:2:2 . Mais pour faire des choses avec ffmpeg il faut parfois connaître le nama de ffmpeg. Vous pouvez le faire comme ceci :

ffmpeg -f v4l2 -list_formats all -i /dev/video0

sortie de l'échantillon :

[video4linux2,v4l2 @ 0x555ba7267240] Raw       :     yuyv422 :           YUYV 4:2:2 : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720
[video4linux2,v4l2 @ 0x555ba7267240] Compressed:       mjpeg :          Motion-JPEG : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720

Cela nous a par exemple indiqué que le nom de ffmpeg pour YUYV 4:2:2 est yuyv422 .

75voto

connie new Points 1072

Pour répertorier tous les périphériques vidéo détectés par le noyau

ls -ltrh /dev/video*

Pour répertorier tous les périphériques attachés à l'USB utilisez lsusb ; pour répertorier tous les périphériques attachés au PCI utilisez lspci

1voto

bunkus Points 11

Pour Windows, vous pouvez utiliser la bibliothèque pygrabber : https://github.com/bunkahle/pygrabber

Pour vérifier les noms conviviaux des webcams connectées :

from __future__ import print_function
from pygrabber.dshow_graph import FilterGraph

graph = FilterGraph()
print(graph.get_input_devices())

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X