c++clinuxwebcamdevice

How to get a list of video capture devices (web cameras) on linux ( ubuntu )? (C/C++)


So all I need is simple - a list of currently avaliable video capture devices (web cameras). I need it in simple C or C++ console app. By list I mean something like such console output:

1) Asus Web Camera
2) Sony Web Camera

So It seems simple but I have one requirement - use of native OS apis as much as possible - no external libs - after all - all we want is to print out a a list - not to fly onto the moon!)

How to do such thing?


also from this series:


Solution

  • This is a code snippet I had laying around. Probably from a book. I guess you could just iterate over all /dev/videoN nodes and get the info.

    #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;
    }