首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试从/dev/ Video4Linux 0读取设备信息时出现错误(#25)

尝试从/dev/ Video4Linux 0读取设备信息时出现错误(#25)
EN

Stack Overflow用户
提问于 2018-06-01 12:29:57
回答 1查看 2.4K关注 0票数 3

我目前正试图使用以下代码检索内置摄像头的设备信息:

代码语言:javascript
复制
#include <fcntl.h>
#include <unistd.h>
#include <linux/media.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(int argc, char **argv) {
   int fd = open("/dev/video0", O_RDONLY, 0);
   if (fd > 0) {
       struct media_device_info *device_data = (struct media_device_info *) malloc (sizeof(struct media_device_info) * 1);

       if (ioctl(fd, MEDIA_IOC_DEVICE_INFO, device_data) ==  0)
            printf("Media Version: %u\nDriver: %s\nVersion: %d\nSerial: %s\n", (unsigned int) device_data->media_version, device_data->driver, (int) device_data->driver_version, device_data->serial);
        else {
               fprintf(stderr, "Couldn't get device info: %d: %s\n", errno, strerror(errno));
       }

       close(fd);
       free(device_data);
    }

    return 0;
}

当代码执行时,将输入else块,从而提供以下内容:

代码语言:javascript
复制
Couldn't get device info: 25: Inappropriate ioctl for device

从这一点看,设备似乎是以错误的方式打开的,因此ioctl无法使用文件描述符。我肯定遗漏了什么;这里有人能帮我打开/dev/video0 0设备吗?

谢谢!

附注:如果在其他地方之前已经回答过这个问题,请告诉我。如果这个问题是无效的,那么请接受我的道歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-27 23:21:12

看起来,/dev/video*设备可能被绑定到不同的/dev/media*设备上,您需要针对相应的/dev/video*设备发出MEDIA_IOC_DEVICE_INFO ioctl。

至于如何定位相应的设备id,我想出的最佳方法是在/sys/class/video4linux/video{N}/device目录中搜索/sys/class/video4linux/video{N}/device文件。

例如,对于我的系统上给定的设备/dev/video0 (内核4.15.0-34-泛型),在/sys/class/video4linux/video0/device下搜索media*文件可以找到media10,然后我可以使用它来恢复序列号(打开/dev/media10,发出ioctl命令)。

我不知道这种查找相应媒体设备的方法在发行版/版本/内核/等等中是否一致。

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

https://stackoverflow.com/questions/50643479

复制
相关文章

相似问题

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