【小记】MSMF 框架开发 UVC 摄像头设置 MF_MT_SUBTYPE 的注意事项

太忙就简单说一下:

IMFSourceReader 有两个可以获取 IMFMediaType 对象的接口,分别是 GetNativeMediaType 与 GetCurrentMediaType。

初始化时调用 GetCurrentMediaType 获得的 IMFMediaType 对象(此时为硬件默认情况下自动选择的对象)再进行修改是不能用于 SetCurrentMediaType 的,即便是 SetCurrentMediaType 返回 S_OK。

正确的做法是先使用 GetNativeMediaType 遍历硬件所支持的 IMFMediaType 中 MF_MT_SUBTYPE 类型 ,再 SetCurrentMediaType 相对应的 IMFMediaType 。

 

示例代码:

    // IMFSourceReader* m_reader = 假设 IMFSourceReader 已经初始化并可用;
    DWORD dwMediaTypeIndex = 0;
    HRESULT hr = S_OK;
    while (hr != MF_E_NO_MORE_TYPES)
    {
        IMFMediaType* pType = nullptr;
        hr = m_reader->GetNativeMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, dwMediaTypeIndex, &pType);
        if (hr == S_OK)
        {
            GUID subtype;
            pType->GetGUID(MF_MT_SUBTYPE, &subtype);
            if (IsEqualGUID(subtype, MFVideoFormat_YUY2)) // 假设需要将硬件输出设置为 YUY2
            {
                iRet = m_reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, pType);
                if (iRet != S_OK)
                {
                    pType->Release();
                    // 处理错误
                    break;
                }
                MFGetAttributeSize(pType, MF_MT_FRAME_SIZE, &m_width, &m_height);
                pType->Release();
                break;
            }
            pType->Release();
        }
        dwMediaTypeIndex++;
    }

 

版权声明:
作者:芯片烤电池
链接:https://www.airchip.org.cn/index.php/2024/01/24/%d1%81jmsmfkjkfuvcsxtrhzrszmfmtsubtype/
来源:芯片烤电池
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
【小记】MSMF 框架开发 UVC 摄像头设置 MF_MT_SUBTYPE 的注意事项
太忙就简单说一下: IMFSourceReader 有两个可以获取 IMFMediaType 对象的接口,分别是 GetNativeMediaType 与 GetCurrentMediaType。 ……
<<上一篇
下一篇>>