wxcam software integrada instalar detecta cheese camara c++ c linux webcam device

c++ - software - webcam linux



¿Cómo obtener una lista de dispositivos de captura de video(cámaras web) en linux(ubuntu)?(C/C++) (4)

Es fácil simplemente atravesar dispositivos sysfs por una clase determinada. La siguiente línea de comando de un forro lo haría:

for I in /sys/class/video4linux/*; do cat $I/name; done

Puede hacer lo mismo en la aplicación C / C ++, simplemente abriendo el directorio /sys/class/video4linux , tendrá enlaces simbólicos a todas sus cámaras web como dispositivos video4linux:

$ ls -al /sys/class/video4linux drwxr-xr-x 2 root root 0 Ноя 27 12:19 ./ drwxr-xr-x 34 root root 0 Ноя 26 00:08 ../ lrwxrwxrwx 1 root root 0 Ноя 27 12:19 video0 -> ../../devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/video4linux/video0/

Puede obtener cada enlace simbólico a un directorio de cada dispositivo y leer el contenido completo del archivo de name en ese directorio para obtener el nombre.

Así que todo lo que necesito es simple: una lista de dispositivos de captura de video disponibles actualmente (cámaras web). Lo necesito en la sencilla aplicación de consola C o C ++. Por lista me refiero a algo así como la salida de consola:

1) Asus Web Camera 2) Sony Web Camera

Así que parece simple, pero tengo un requisito: el uso de las API nativas del sistema lo más posible, no hay librerías externas; después de todo, lo único que queremos es imprimir una lista, ¡no volar a la luna!)

¿Cómo hacer tal cosa?

también de esta serie:


Este es un fragmento de código que tenía por ahí. Probablemente de un libro. Supongo que podría iterar sobre todos los nodos / dev / videoN y obtener la información.

#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/videodev.h> int main(){ int fd; struct video_capability video_cap; struct video_window video_win; struct video_picture video_pic; if((fd = open("/dev/video0", O_RDONLY)) == -1){ perror("cam_info: Can''t open device"); return 1; } if(ioctl(fd, VIDIOCGCAP, &video_cap) == -1) perror("cam_info: Can''t get capabilities"); else { printf("Name:/t/t ''%s''/n", video_cap.name); printf("Minimum size:/t%d x %d/n", video_cap.minwidth, video_cap.minheight); printf("Maximum size:/t%d x %d/n", video_cap.maxwidth, video_cap.maxheight); } if(ioctl(fd, VIDIOCGWIN, &video_win) == -1) perror("cam_info: Can''t get window information"); else printf("Current size:/t%d x %d/n", video_win.width, video_win.height); if(ioctl(fd, VIDIOCGPICT, &video_pic) == -1) perror("cam_info: Can''t get picture information"); else printf("Current depth:/t%d/n", video_pic.depth); close(fd); return 0; }


La documentación de V4L2 dice que puede haber 64 dispositivos permitidos para cada tipo. Por ejemplo, para ruta / dev / video puede haber 64 dispositivos direccionados como / dev / video0, / dev / video1, / dev / video2 ...

Iterar sobre 64 dispositivos hasta que el ioctl vuelva a ENIVAL, que especifica el final del árbol.


Puedes usar el siguiente comando de bash:

v4l2-ctl --list-devices

Para usar el comando anterior, debe instalar el paquete v4l-utils antes. En Ubuntu / Debian puedes usar el comando:

sudo apt-get install v4l-utils