C++ 如何在linux(ubuntu)上获取视频捕获设备名称(网络摄像头)列表?(C/C+;+;)

C++ 如何在linux(ubuntu)上获取视频捕获设备名称(网络摄像头)列表?(C/C+;+;),c++,c,linux,webcam,device,C++,C,Linux,Webcam,Device,所以我所需要的只是一个简单的列表——一个当前可用的视频捕获设备(网络摄像机)的列表。我需要它在简单的C或C++控制台应用程序。我所说的列表是指类似于控制台输出的内容: 1) Asus Web Camera 2) Sony Web Camera 因此,我知道如何使用以下代码获取cam道具,如W、H等: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl

所以我所需要的只是一个简单的列表——一个当前可用的视频捕获设备(网络摄像机)的列表。我需要它在简单的C或C++控制台应用程序。我所说的列表是指类似于控制台输出的内容:

1) Asus Web Camera
2) Sony Web Camera
因此,我知道如何使用以下代码获取cam道具,如W、H等:

#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;
}
#包括
#包括
#包括
#包括
#包括
int main(){
int-fd;
结构视频功能视频帽;
struct video\u window video\u win;
结构视频图片视频图片;
如果((fd=open(“/dev/video0”,仅限ordu))=-1){
perror(“cam_信息:无法打开设备”);
返回1;
}
如果(ioctl(fd、VIDIOCGCAP和video_cap)=-1)
perror(“cam_信息:无法获取功能”);
否则{
printf(“名称:\t\t“%s”\n”,视频\u cap.Name);
printf(“最小尺寸:\t%d x%d\n”,video\u cap.minwidth,video\u cap.minheight);
printf(“最大大小:\t%d x%d\n”,video\u cap.maxwidth,video\u cap.maxheight);
}
if(ioctl(fd、VIDIOCGWIN和video_-win)=-1)
perror(“cam_信息:无法获取窗口信息”);
其他的
printf(“当前大小:\t%d x%d\n”,video\u win.width,video\u win.height);
如果(ioctl(fd、vidiocgpect和video_pic)=-1)
perror(“cam_信息:无法获取图片信息”);
其他的
printf(“当前深度:\t%d\n”,视频图片深度);
关闭(fd);
返回0;
}
但不是名字(如何获得名字

所以这看起来很简单,但我有一个要求——尽可能多地使用本机操作系统API——没有外部LIB——毕竟——我们只想打印一个列表——而不是飞上月球!)

怎么做这样的事


本系列还包括:

  • 并且有正确的、经过测试的答案
  • 用正确的,还没有被我的答案检验过的
  • 有正确的、经过测试的答案

您使用的是不推荐使用的V4L1 API—V4L2是新代码的首选API

在任何情况下,
ioctl()
都可能是您想要的。您需要查看返回的
struct v4l2\u功能
结构的
.card
字段

编辑:


您可以查看该实用程序的源代码,它完全满足您的需要。

V4L2文档说,每种类型可以有64个允许的设备。例如,对于路径/dev/video,可以有64个设备寻址为/dev/video0、/dev/video1、/dev/video2


在64个设备上迭代,直到ioctl返回ENIVAL,它指定树的结尾。

/sys/class/video4linux/video*/name@Ignacio Vazquez Abrams您能提供如何集成到我的代码中以打印名称的代码吗?您能将您的代码段与我的代码段连接起来吗?