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:
- ¿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 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