web-dev-qa-db-fra.com

Comment obtenir une liste de périphériques de capture vidéo (caméras Web) sur linux (Ubuntu)? (C/C++)

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:

24
Rella

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;
}
13
BlueDog

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
31
Denio Mariz

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.

29
GreyCat

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.

0
tejusadiga2004