You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在libuvc中获取相机全部像素格式及分辨率并进行设置?

关于libuvc的两个操作问题解答

1. 获取相机支持的全部像素格式与分辨率

要获取相机支持的所有像素格式及对应分辨率,核心是遍历设备的格式描述符和帧描述符:

  • 先通过uvc_find_device、uvc_open等API枚举并打开目标UVC设备
  • 获取设备的格式描述符链表,每个格式描述符对应一种像素格式
  • 在每个格式描述符下,遍历帧描述符,每个帧描述符对应一组分辨率和帧率参数

关键代码示例:

// 假设已成功打开设备,得到uvc_device_handle_t *devh
uvc_format_desc_t *format_desc;
uvc_frame_desc_t *frame_desc;

// 遍历所有格式描述符
for (format_desc = devh->dev->first_format; format_desc != NULL; format_desc = format_desc->next) {
    // 打印像素格式名称(如YUYV、MJPG等)
    printf("像素格式: %s\n", uvc_format_name(format_desc->bDescriptorSubtype, format_desc->guidFormat));
    
    // 遍历当前格式下的所有分辨率与帧率配置
    for (frame_desc = format_desc->frame_descs; frame_desc != NULL; frame_desc = frame_desc->next) {
        printf("  分辨率: %dx%d, 帧率范围: %d-%d fps\n",
               frame_desc->wWidth, frame_desc->wHeight,
               frame_desc->dwMinFrameInterval / 10000, frame_desc->dwMaxFrameInterval / 10000);
    }
}

2. 为相机设置指定的像素格式与分辨率

设置指定参数需先匹配对应的格式和帧描述符,再调用API完成配置并启动流:

  • 遍历格式描述符,找到目标像素格式对应的uvc_format_desc_t
  • 在该格式下遍历帧描述符,找到目标分辨率对应的uvc_frame_desc_t
  • 调用uvc_set_format设置格式,再通过uvc_start_streaming启动视频流

关键代码示例:

// 目标参数:像素格式YUYV,分辨率640x480
uvc_format_desc_t *target_format = NULL;
uvc_frame_desc_t *target_frame = NULL;

// 查找目标格式与分辨率
for (format_desc = devh->dev->first_format; format_desc != NULL; format_desc = format_desc->next) {
    if (uvc_format_match(format_desc, UVC_FRAME_FORMAT_YUYV)) { // 匹配YUYV格式
        target_format = format_desc;
        for (frame_desc = format_desc->frame_descs; frame_desc != NULL; frame_desc = frame_desc->next) {
            if (frame_desc->wWidth == 640 && frame_desc->wHeight == 480) {
                target_frame = frame_desc;
                break;
            }
        }
        if (target_frame != NULL) break;
    }
}

if (target_format && target_frame) {
    // 设置格式
    uvc_error_t ret = uvc_set_format(devh, target_format, target_frame, UVC_FMT_FLAG_NONE);
    if (ret == UVC_SUCCESS) {
        // 启动流(示例用回调方式,也可使用阻塞方式)
        ret = uvc_start_streaming(devh, 0, uvc_frame_callback, NULL, 0);
        if (ret == UVC_SUCCESS) {
            printf("已成功设置640x480 YUYV格式并启动流\n");
        }
    }
}

内容的提问来源于stack exchange,提问作者Wunian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:08