這是目前一種有效的解決方案,我不是100%肯定它的工作原理,但有什麼可以做的是:
1)在啓動時枚舉可能被使用的所有編解碼器(我的理解在這種情況下,H264編碼器)和訂閱設定變更事件
MFT_REGISTER_TYPE_INFO TransformationOutput = { MFMediaType_Video, MFVideoFormat_H264 };
DWORD nFlags = MFT_ENUM_FLAG_ALL;
UINT32 nCount = 0;
CLSID* pClsids;
MFTEnum(MFT_CATEGORY_VIDEO_ENCODER, nFlags, NULL, &TransformationOutput, NULL, &pClsids, &nCount);
// Ok here we assume nCount is 1 and we got the MS encoder
ICodecAPI *pMsEncoder;
hr = CoCreateInstance(pClsids[0], NULL, CLSCTX_INPROC_SERVER, __uuidof(ICodecAPI), (void**)&pMsEncoder);
// nCodecIds is supposed to be an array of identifiers to distinguish the sender
hr = pMsEncoder->RegisterForEvent(CODECAPI_AVEncVideoOutputFrameRate, (LONG_PTR)&nCodecIds[0]);
2)不是100%肯定,如果幀速率設定也被設置時,數據流的輸入媒體類型設置,但無論如何你可以試試在SinkWriter
檢索到的ICodecAPI
上設置相同的屬性。然後在得到事件後,您應該能夠通過比較lParam1
與傳遞的值來識別編解碼器。但是這仍然很差,因爲它依賴於所有編碼器支持事件通知並且如果我關於在流構造中生成的事件的假設是錯誤的,則需要不必要的參數改變。
沒有人找到對此的迴應嗎?這似乎是一件非常基本的事情,至少GUID會有所幫助。 –