请教各位大佬 uvc v4l2 的问题

88 天前
 SageKwun

最近在做通过 uvc/v4l2 控制相机的内容,是通过拓展单元来控制的,但是代码跑不通

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>

#define DEVICE_PATH "/dev/video0" // 替换为你的 UVC 设备路径
#define XU_CONTROL_ID 0x06        // 替换为控制内录的 XU 控制 ID

int main() {
    int fd;
    struct v4l2_ext_control ext_ctrl;
    struct v4l2_ext_controls ext_ctrls;
    int result;

    fd = open(DEVICE_PATH, O_RDWR);
    if (fd < 0) {
        perror("打开设备失败");
        return -1;
    }

    // 设置 UVC 扩展控制来开启 1080p60fps 内录
    ext_ctrl.id = XU_CONTROL_ID;
    ext_ctrl.size = 0x01;
    ext_ctrl.value = 0x34; // 该值用于开启 1080p60fps 内录

    ext_ctrls.ctrl_class = V4L2_CTRL_CLASS_USER;
    ext_ctrls.count = 1;
    ext_ctrls.controls = &ext_ctrl;

    result = ioctl(fd, VIDIOC_S_EXT_CTRLS, &ext_ctrls);
    if (result) {
        perror("设置扩展控制失败");
        close(fd);
        return -1;
    }

    printf("成功开启 1080p60fps 内录\n");

    close(fd);
    return 0;
}

bLength : 0x19 (25 bytes)
bDescriptorType : 0x24 (Video Control Interface)
bDescriptorSubtype : 0x06 (Extension Unit)
bUnitID : 0x06 (ID 6)
guidExtensionCode : 
{41769EA2-04DE-E347-8B2B-F4341AFF003B}
bNumControls : 0x02 (2 Controls)
bNrInPins : 0x00 (0 Input Pin)
bControlSize : 0x01 (1 bytes)
bmControls : 0x03
D0 字段 uint8_t value 说明
0 0x30 关闭内录
0x31 开启内录 1080p25fps
0x32 开启内录 1080p30fps
0x33 开启内录 1080p50fps
0x34 开启内录 1080p60fps
1~14 保留 默认为 0x00
15 length 默认为 0x0F

结果:

设置扩展控制失败: Invalid argument

Process finished with exit code 255

467 次点击
所在节点    问与答
2 条回复
ysc3839
88 天前
先用 Guvcview 试试有没有问题?
SageKwun
88 天前
@ysc3839 纯命令行,没有图形界面。。采集画面和控制之前通过别的软件试过了,是可以的,主要是这个拓展的部分需要自己编码实现,跑不通(之前没有做过这方面的)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1017903

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX