尝试从/ dev / video0读取设备信息时Video4Linux ioctl错误(#25)

时间:2018-06-01 12:29:57

标签: c linux linux-kernel video4linux

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

#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设备吗?

谢谢!

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

1 个答案:

答案 0 :(得分:1)

似乎/dev/video*设备可能绑定到单独的/dev/media*设备,并且您需要针对{{ 1}}设备。

关于如何找到相应的设备ID,我想出的最好办法是在MEDIA_IOC_DEVICE_INFO目录中搜索/dev/media*文件。

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

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