Nuestro equipo redactor ha pasado horas buscando respuestas a tus búsquedas, te regalamos la respuesta por eso deseamos serte de gran apoyo.
Solución:
v4l2-ctl --list-devices
sudo apt-get install v4l-utils
v4l2-ctl --list-devices
Salida de muestra con una sola cámara:
Integrated Camera (usb-0000:00:1a.0-1.6):
/dev/video0
Probado en Ubuntu 16.04.
video1
dispositivo de metadatos
Sin embargo, en Ubuntu 19.10 Lenovo Thinkpad P51, enumera dos de estos dispositivos, video0
y video1
, pero solo tengo una cámara y solo puedo ver imágenes de video0
con ffplay
. Esto se ha preguntado en:
- Cuatro entradas / dev / video pero solo una cámara
- https://unix.stackexchange.com/questions/512759/multiple-dev-video-for-one-physical-device
Lo que pasa es que /dev/video1
contiene solo algún tipo de metadatos de video y no las imágenes como se puede ver en:
sudo v4l2-ctl --device=/dev/video0 --all
sudo v4l2-ctl --device=/dev/video1 --all
que muestra respectivamente:
Device Caps : 0x04200001
Video Capture
Device Caps : 0x04a00000
Metadata Capture
Cómo ver la imagen de la cámara en vivo
- https://unix.stackexchange.com/questions/3304/how-do-i-watch-my-webcams-feed-in-linux
- ¿Qué aplicaciones de cámara web están disponibles y cómo comprobar si su cámara web funciona?
Mi favorito:
sudo apt install ffmpeg
ffplay /dev/video0
Toma una sola foto desde la línea de comando
Toma una foto desde la terminal
ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -frames 1 out.jpg
Grabe un video desde la línea de comando
- Grabador de video con cámara web
- capturar video de la cámara web y guardarlo en un archivo
- ¿Algo mejor que Cheese para la captura de video?
Parámetros elegidos en función de “Cómo obtener parámetros de la cámara como la resolución” a continuación:
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -c copy out.mkv
Luego:
ffprobe out.mkv
contiene como se esperaba:
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Si elige parámetros incorrectos, la resolución puede ser lenta. La cámara ya genera un formato codificado específico, y la forma más sencilla de grabar es simplemente copiar ese formato como se indica arriba:
- 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 reemplazo -c copy out.mkv
con out.ogv
para intentar grabar directamente en un formato abierto (a diferencia de MJPEG), obtuve un video de baja resolución.
Captura de imagen / video interactiva con vista previa
Programas de captura de imágenes / videos
Hasta que aprenda a correr ffplay
previsualizar en un shell y capturar al mismo tiempo desde otro shell con ffmpeg
(pelean por el dispositivo de video), tendré que rebajarme a este increíble programa GUI:
sudo apt install cheese
Leer datos de la cámara desde C / C ++
https://stackoverflow.com/questions/4290834/how-to-get-a-list-of-video-capture-devices-web-cameras-on-linux-ubuntu-c
Un ejemplo concreto de C ++ que procesa imágenes de la cámara en la GPU con OpenGL y las muestra en vivo: https://stackoverflow.com/questions/13693946/image-processing-with-glsl-shaders/40641014#40641014
Cómo obtener parámetros de la cámara como la resolución
- ¿Cómo puedo averiguar las resoluciones de cámara web compatibles?
- https://superuser.com/questions/639738/how-can-i-list-the-available-video-modes-for-a-usb-webcam-in-linux
v4l2-ctl --list-formats-ext
produce buena información:
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)
Cómo obtener las codificaciones ffmpeg correspondientes
v4l2-ctl --list-formats-ext
da el nombre del kernel de Linux de las cosas, por ejemplo. YUYV 4:2:2
. Pero para hacer cosas con ffmpeg
, a veces necesitas conocer el ffmpeg nama. Puedes hacerlo así:
ffmpeg -f v4l2 -list_formats all -i /dev/video0
salida de muestra:
[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
Esto, por ejemplo, nos dijo que el nombre ffmpeg para YUYV 4:2:2
es yuyv422
.
Para enumerar todos los dispositivos de video recogidos por el kernel
ls -ltrh /dev/video*
Para enumerar todos los dispositivos conectados al uso de USB lsusb
; para enumerar todos los dispositivos conectados al uso de PCI lspci