【问题标题】:Video4Linux ioctl error (#25) when attempting to read device information from /dev/video0尝试从 /dev/video0 读取设备信息时出现 Video4Linux ioctl 错误 (#25)
【发布时间】:2018-06-01 12:29:57
【问题描述】:

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

#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 块,从而给出以下内容:

Couldn't get device info: 25: Inappropriate ioctl for device

由此看来,设备以错误的方式打开,导致 ioctl 无法使用文件描述符。我肯定错过了什么;这里有人可以帮我打开 /dev/video0 设备吗?

谢谢!

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

【问题讨论】:

  • 你有/dev/media*吗?
  • 我不知道,但你确定你调用了正确的 open() 函数。在 ioctl() 调用 open() 的示例中,只需要 2 个参数。但是青年函数需要 3 个。
  • 同时检查你编译的linux是否启用了CONFIG_MEDIA_CONTROLLER
  • 到目前为止感谢您的 cmets,(1) 我没有任何 /dev/media* 设备 (2) 我确实尝试了需要 2 个参数的 open 方法,得到了相同的结果。 (3) 运行cat /boot/config-$(uname -r) | grep CONFIG_MEDIA_CONTROLLER 给出CONFIG_MEDIA_CONTROLLER=y
  • 你确定内核部分支持这个ioctl吗?

标签: c linux linux-kernel video4linux


【解决方案1】:

似乎/dev/video* 设备可能绑定到单独的/dev/media* 设备,您需要针对您的/dev/video* 设备对应的/dev/media* 设备发出MEDIA_IOC_DEVICE_INFO ioctl。

至于如何找到对应的设备ID,我想出的最好方法是在/sys/class/video4linux/video{N}/device目录中搜索media*文件。

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

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

【讨论】:

  • 按照您的步骤,发现现在列出了一个 media0,并且看到它确实存在 - 在设备文件夹 (/dev/media0) 中。所以,关于导航的好建议。其他所有发表评论的人都坚持认为 /dev/media0 应该存在是正确的——为什么之前没有列出它仍然是个谜。
猜你喜欢
  • 2021-12-31
  • 2019-09-03
  • 2019-01-20
  • 2019-09-04
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多