Donc, tout ce dont j'ai besoin est simple - une liste des périphériques de capture vidéo actuellement disponibles (caméras Web). J'en ai besoin dans une simple application de console C ou C++. Par liste, je veux dire quelque chose comme cette sortie de console:
1) Asus Web Camera
2) Sony Web Camera
Cela semble donc simple, mais j’ai une exigence: utiliser le plus possible l’API natif du système d’exploitation - aucune bibliothèque externe - après tout, tout ce que nous voulons, c’est imprimer une liste - ne pas voler sur la lune!
Comment faire une telle chose?
aussi de cette série:
Ceci est un extrait de code que j'avais traîner. Probablement d'un livre. Je suppose que vous pouvez simplement parcourir tous les nœuds/dev/videoN et obtenir les informations.
#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;
}
Vous pouvez utiliser la commande bash suivante:
v4l2-ctl --list-devices
Pour pouvoir utiliser la commande ci-dessus, vous devez installer le packagev4l-utilsbefore. Dans Ubuntu/Debian, vous pouvez utiliser la commande:
Sudo apt-get install v4l-utils
C'est facile en parcourant simplement les périphériques sysfs par une classe donnée. La ligne de commande suivante, une ligne, le ferait:
for I in /sys/class/video4linux/*; do cat $I/name; done
Vous pouvez faire la même chose dans l'application C/C++, en ouvrant simplement le répertoire /sys/class/video4linux
, il aura des liens symboliques vers toutes vos caméras Web en tant que périphériques 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/
Vous pouvez suivre chaque lien symbolique vers un répertoire de chaque périphérique et lire le contenu complet du fichier name
de ce répertoire pour obtenir le nom.
La documentation de V4L2 indique qu'il peut y avoir 64 périphériques autorisés pour chaque type. Par exemple, pour le chemin/dev/video, il peut y avoir 64 périphériques adressés comme/dev/video0,/dev/video1,/dev/video2 ...
Itérez plus de 64 périphériques jusqu'à ce que l'ioctl renvoie ENIVAL, qui spécifie la fin de l'arborescence.