【小记】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++;
    }

 

 
posted @ 2024-01-24 20:18  芯片烤电池  阅读(100)  评论(0编辑  收藏  举报