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