首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从C应用程序(Linux)获取已连接的USB摄像头(网络摄像头)的v4l2设备号

从C应用程序(Linux)获取已连接的USB摄像头(网络摄像头)的v4l2设备号
EN

Stack Overflow用户
提问于 2020-06-30 23:10:27
回答 1查看 2.1K关注 0票数 3

我在一个嵌入式linux系统(基于yocto)上工作,我正在尝试从一个C程序中简单地获取摄像头USB视频设备(网络摄像头)编号和相关的连接usb端口的列表。

通过执行以下操作,我可以获得包含供应商ID和连接端口的设备列表:

代码语言:javascript
运行
复制
void usbdevs()
{
    libusb_device*** list=NULL;
    libusb_context *context = NULL;
    ssize_t count;
    uint8_t port;
    char ncameras=0;

    libusb_init(&context);

    count = libusb_get_device_list(context,&list);

    for(int i=0; i < MAX_NUM_CAMS; i++)
        usb_dev_list[i]=0;

    for (size_t idx = 0; idx < count; ++idx) {
        libusb_device *device = list[idx];
        struct libusb_device_descriptor desc = {0};

        libusb_get_device_descriptor(device, &desc);
        port = libusb_get_port_number(device);
        printf("Vendor:Device = %04x:%04x Port: %d\n", desc.idVendor, desc.idProduct,port);
    }

    libusb_free_device_list(list, count);
    libusb_exit(context);

}

我现在需要的是(从C应用程序)知道什么v4l2设备号与usb摄像头端口相关,例如。我已经连接了两个摄像头(相同的供应商ID),分别显示为/dev/video0和/dev/video1,我可以使用上面的代码获得每个摄像头的连接端口,但是,我如何知道每个摄像头都连接了哪些端口?

我尝试使用ioctl调用从设备获取信息,因为这是推荐的in this question,但当我运行代码时:

代码语言:javascript
运行
复制
int checkvideodev()
{
    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(xioctl(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(xioctl(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(xioctl(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;
}

我得到了下一个错误:

代码语言:javascript
运行
复制
cam_info: Can't get capabilities: Inappropriate ioctl for device
cam_info: Can't get window information: Inappropriate ioctl for device
cam_info: Can't get picture information: Inappropriate ioctl for device

例如,如果我通过命令行检查,我可以毫不费力地运行这些功能:

代码语言:javascript
运行
复制
v4l2-ctl --device-/dev/video0 --list-formats-ext

有什么想法可以做到吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-01 01:47:18

我不知道这是否具体回答了你的问题,但你可以通过球化/dev或/sys下的某些模式来获得有用的信息,例如,这将返回每个视频设备的完整设备路径(包括PCI总线)。

代码语言:javascript
运行
复制
#include <glob.h>
#include <unistd.h>

void list_videos() {
  int i;
  glob_t globbuf;
  if (glob("/sys/class/video4linux/video*", 0, NULL, &globbuf) != 0) {
    perror("glob");
    return;
  }
  for (i=0; i < globbuf.gl_pathc; i++) {
    char buf[256] = {};
    if (readlink(globbuf.gl_pathv[i], buf, sizeof(buf)-1) > 0) {
      puts(buf);
    }
  }
}

在一个有2个摄像头的系统上,

代码语言:javascript
运行
复制
../../devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.1/2-1.1:1.0/video4linux/video0
../../devices/pci0000:00/0000:00:14.0/usb2/2-3/2-3:1.0/video4linux/video1

其他有趣的glob字符串包括/dev/v4l/by-id/*/dev/v4l/by-path/*

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62660606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档