Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VIDIOC_ENUMINPUT不返回任何视频标准_C_Linux_V4l2 - Fatal编程技术网

VIDIOC_ENUMINPUT不返回任何视频标准

VIDIOC_ENUMINPUT不返回任何视频标准,c,linux,v4l2,C,Linux,V4l2,我一直在玩一个基于v4l2的uvc驱动程序的用户空间应用程序。我一直在尝试我的集成网络摄像头(这是一台笔记本电脑)的功能,然后我遇到了一个问题。我的驱动程序没有针对VIDIOC_ENUMINPUT ioctl设置任何视频标准标志。下面是我的代码 struct v4l2_capability caps; memset(&caps, 0, sizeof(caps)); if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &caps)) { perror(

我一直在玩一个基于v4l2的uvc驱动程序的用户空间应用程序。我一直在尝试我的集成网络摄像头(这是一台笔记本电脑)的功能,然后我遇到了一个问题。我的驱动程序没有针对VIDIOC_ENUMINPUT ioctl设置任何视频标准标志。下面是我的代码

struct v4l2_capability caps;
memset(&caps, 0, sizeof(caps));

if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &caps)) {
    perror("Unable to query capabilities");
    return errno;
}

printf(
        "--------  VIDIOC_QUERYCAP  --------\n"
        "Driver       = %s\n"
        "Card         = %s\n"
        "Bus Info     = %s\n"
        "Version      = %d\n"
        "Capabilities = %#x\n"
        "Device Caps  = %#x\n",
        caps.driver,
        caps.card,
        caps.bus_info,
        caps.version,
        caps.capabilities,
        caps.device_caps);


int index;

if(-1 == ioctl(fd, VIDIOC_G_INPUT, &index)) {
    perror("Unable to get current input index");
    return errno;
}

struct v4l2_input input;
memset(&input, 0, sizeof(input));
input.index = index;

if(-1 == ioctl(fd, VIDIOC_ENUMINPUT, &input)) {
    perror("Unabel to query attributes of video input");
    return errno;
}

printf(
        "--------- VIDIOC_ENUMINPUT ---------\n"
        "Index        = %d\n"
        "Name         = %s\n"
        "Type         = %d\n"
        "Audio Set    = %d\n"
        "Video Stds   = %lld\n"
        "Status       = %d\n"
        "Capabilities = %d\n",
        input.index,
        input.name,
        input.type,
        input.audioset,
        input.std,
        input.status,
        input.capabilities);
输出如下所示

--------  VIDIOC_QUERYCAP  --------
Driver       = uvcvideo
Card         = Integrated_Webcam_HD: Integrate
Bus Info     = usb-0000:00:1d.0-1.6
Version      = 266001
Capabilities = 0x84200001
Device Caps  = 0x4200001
--------- VIDIOC_ENUMINPUT ---------
Index        = 0
Name         = Camera 1
Type         = 2
Audio Set    = 0
Video Stds   = 0    // <--- Problem here.
Status       = 0
Capabilities = 0
但收到以下错误

Error: Inappropriate ioctl for device
结论是什么?我做错什么了吗

站台详情
  • Linux Linux 4.15.0-20-generic 21 Ubuntu SMP周二4月24日06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  • 驱动程序版本:4.15.17
  • 设备节点:/dev/video0(仅一个设备)

    • 我想我自己找到了答案。经过仔细评估,我发现我笔记本电脑上的集成网络摄像头内部位于USB总线上。USB类设备是v4l2视频标准ioctl的一个例外。根据文件

      特殊规则适用于USB摄像机等设备,因为视频标准的概念毫无意义。更一般地,对于不能以视频标准的标称速率捕获场或帧,或者根本不支持视频标准格式的任何捕获或输出设备。在此,驱动程序应将结构v4l2_输入和结构v4l2_输出的std字段设置为零,VIDIOC_G_std、VIDIOC_S_std、ioctl VIDIOC_QUERYSTD和ioctl VIDIOC_ENUMSTD ioctls应返回ENOTTY错误代码或EINVAL错误代码

      因此,我认为我的相机属于这些类别之一,STD查询在我的案例中并不适用。我不确定这是否适用于或并行总线。一旦我对这些硬件做了更多的实验,我就会更新

      Error: Inappropriate ioctl for device