最近在做通过 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.