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

Entonces, todo lo que necesito es simple: una lista de los dispositivos de captura de video actualmente disponibles (cámaras web). Lo necesito en una aplicación simple 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: usar aplicaciones API nativas tanto como sea posible, sin libretas externas; después de todo, todo lo que queremos es imprimir una lista, ¡no volar a la luna!

¿Cómo hacer tal cosa?


también de esta serie:

  • ¿Cómo obtener una lista de dispositivos de captura de video en Linux? y detalles especiales sobre cómo obtener NOMBRES de cámaras con respuestas correctas y probadas
  • ¿Cómo obtener una lista de dispositivos de captura de video en Mac OS? con correcto, aún no probado por mis respuestas
  • ¿Cómo obtener una lista de dispositivos de captura de video en Windows? con respuestas correctas y probadas
  • ¿Cómo obtener una lista de dispositivos de captura de video NOMBRES usando Qt (plataforma cruzada)?

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

 #include  #include  #include  #include  #include  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%dx %d\n", video_cap.minwidth, video_cap.minheight); printf("Maximum size:\t%dx %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%dx %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; } 

Puede usar el siguiente comando 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 

Es fácil simplemente atravesando los dispositivos sysfs por una clase determinada. El siguiente trazador de líneas de línea de comando lo haría:

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

Usted 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 seguir 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.

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

Iterar más de 64 dispositivos hasta que ioctl restablezca ENIVAL que especifica el final del árbol.