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
?
Réponses
Trop de publicités?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 à :
- Quatre entrées /dev/video mais une seule caméra
- https://unix.stackexchange.com/questions/512759/multiple-dev-video-for-one-physical-device
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
- https://unix.stackexchange.com/questions/3304/how-do-i-watch-my-webcams-feed-in-linux
- Quelles sont les applications pour webcam disponibles et comment vérifier si votre webcam fonctionne ?
Mon préféré :
sudo apt install ffmpeg
ffplay /dev/video0
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
- Enregistreur vidéo par webcam
- capturer une vidéo à partir d'une webcam et l'enregistrer dans un fichier
- Rien de mieux que Cheese pour la capture vidéo ?
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 :
- https://stackoverflow.com/questions/47292785/recording-from-webcam-using-ffmpeg-at-high-framerate
- https://superuser.com/questions/1021899/what-ffmpeg-settings-to-get-the-best-possible-video-resolution-framerate-that-my
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
Lire les données de la caméra à partir de C/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
Comment obtenir les paramètres de la caméra comme la résolution
- Comment puis-je connaître les résolutions de webcam prises en charge ?
-
v4l2-ctl --list-formats-ext
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
.
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())