尝试从 /dev/video0 读取设备信息时出现 Video4Linux ioctl 错误(#25)
Video4Linux ioctl error (#25) when attempting to read device information from /dev/video0
我目前正在尝试使用以下代码检索内置网络摄像头的设备信息:
#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。如果之前在其他地方已经回答过这个问题,请告诉我。如果这个问题无论如何都无效,那么请接受我的道歉。
似乎 /dev/video*
设备可能绑定到单独的 /dev/media*
设备,您需要针对相应的 /dev/media*
设备发出 MEDIA_IOC_DEVICE_INFO
ioctl /dev/video*
设备。
至于如何找到相应的设备 ID,我想到的最好办法是在 /sys/class/video4linux/video{N}/device
目录中搜索 media*
文件。
例如,对于我系统(内核 4.15.0-34-generic)上的给定设备 /dev/video0
,搜索 /sys/class/video4linux/video0/device
下的 media*
个文件出现 media10
,然后我可以用它来恢复序列号(打开 /dev/media10
,发出 ioctl 命令)。
不知道这种查找对应媒体设备的方法在distros/versions/kernels/etc之间是否一致。
我目前正在尝试使用以下代码检索内置网络摄像头的设备信息:
#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。如果之前在其他地方已经回答过这个问题,请告诉我。如果这个问题无论如何都无效,那么请接受我的道歉。
似乎 /dev/video*
设备可能绑定到单独的 /dev/media*
设备,您需要针对相应的 /dev/media*
设备发出 MEDIA_IOC_DEVICE_INFO
ioctl /dev/video*
设备。
至于如何找到相应的设备 ID,我想到的最好办法是在 /sys/class/video4linux/video{N}/device
目录中搜索 media*
文件。
例如,对于我系统(内核 4.15.0-34-generic)上的给定设备 /dev/video0
,搜索 /sys/class/video4linux/video0/device
下的 media*
个文件出现 media10
,然后我可以用它来恢复序列号(打开 /dev/media10
,发出 ioctl 命令)。
不知道这种查找对应媒体设备的方法在distros/versions/kernels/etc之间是否一致。