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

如何通过MediaFoundation设置/获取UVC摄像头的亮度、对比度等属性

在MediaFoundation中控制UVC摄像头的图像属性(亮度、对比度等)

如果你用MediaFoundation做UVC摄像头预览,不需要依赖DirectShow的IAMVideoProcAmp,MF本身提供了原生的控制方式,也支持兼容调用DirectShow接口,以下是具体实现:

原生MediaFoundation实现(推荐)

步骤1:获取摄像头的IMFMediaSource

这是MF摄像头预览的基础,先通过设备枚举拿到目标摄像头的IMFMediaSource实例。

步骤2:获取IMFVideoProcAmp接口

MF的IMFVideoProcAmp接口专门用于控制视频采集设备的图像属性,直接从IMFMediaSource查询即可:

IMFVideoProcAmp* pProcAmp = nullptr;
HRESULT hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&pProcAmp));
if (FAILED(hr)) {
    // 处理接口获取失败的情况
}

步骤3:操作亮度、对比度等属性

通过GetRange获取属性的可调范围,Get读取当前值,Set设置新值:

  • 亮度对应枚举值:MF_VIDEOPROCAMP_BRIGHTNESS
  • 对比度对应枚举值:MF_VIDEOPROCAMP_CONTRAST
  • 其他常用属性:饱和度(MF_VIDEOPROCAMP_SATURATION)、色调(MF_VIDEOPROCAMP_HUE)等

示例代码:

// 获取亮度的可调范围
LONG minBright, maxBright, stepBright, defaultBright;
BOOL autoBright;
hr = pProcAmp->GetRange(MF_VIDEOPROCAMP_BRIGHTNESS, &minBright, &maxBright, &stepBright, &defaultBright, &autoBright);

// 获取当前亮度值
LONG currentBright;
hr = pProcAmp->Get(MF_VIDEOPROCAMP_BRIGHTNESS, &currentBright, &autoBright);

// 设置亮度为自定义值(关闭自动调节)
LONG targetBright = (minBright + maxBright) / 2; // 取中间值
hr = pProcAmp->Set(MF_VIDEOPROCAMP_BRIGHTNESS, targetBright, FALSE);

兼容DirectShow的IAMVideoProcAmp接口

如果必须使用DirectShow的IAMVideoProcAmp,可以通过MF的IMFGetService接口获取:

// 从IMFMediaSource获取IMFGetService
IMFGetService* pGetService = nullptr;
hr = pMediaSource->QueryInterface(IID_PPV_ARGS(&pGetService));
if (SUCCEEDED(hr)) {
    // 请求DirectShow的IAMVideoProcAmp服务
    IAMVideoProcAmp* pDsProcAmp = nullptr;
    hr = pGetService->GetService(MF_SERVICE_DXVA_DIRECTSHOW_SERVICE, IID_PPV_ARGS(&pDsProcAmp));
    if (SUCCEEDED(hr)) {
        // 使用DirectShow接口操作属性
        long val, min, max, step, def;
        BOOL autoVal;
        pDsProcAmp->Get(VidProcAmp_Brightness, &val, &min, &max, &step, &def, &autoVal);
        pDsProcAmp->Set(VidProcAmp_Brightness, 100, FALSE);
        
        pDsProcAmp->Release();
    }
    pGetService->Release();
}

关键注意事项

  • 不同UVC摄像头支持的属性范围不同,调用GetRange前要检查返回值,若返回E_NOTIMPL则说明该属性不支持调节。
  • 设置属性时必须确保值在GetRange返回的min和max之间,否则会返回错误。
  • 只有关闭自动调节(Set方法最后一个参数传FALSE),手动设置的属性值才会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:13:02