我正在尝试使用Windows 10(桌面版)上的DirectX 11为Media Foundation编写EVR。 到目前为止我找到的唯一解决方案是here 不幸的是,我不知道(和许多其他人一样)如何正确使用它。 有人可以指出我如何将MF与DirectX 11/12结合起来的正确方向吗?
我正在使用激活我的EVR的代码:
hr = MFCreateVideoRendererActivate(hwndVideo, &pRendererActivate);
hr = pRendererActivate->SetGUID(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_CLSID, CLSID_DX11VideoRenderer);
我发现MF要求GetDeviceID,并在kernel.dll中引发异常。我认为混音器和渲染器设备之间存在不匹配。它们的默认设备是DX9。在我的示例中,我必须提供一个DirectX 11设备CLSID。
答案 0 :(得分:0)
DX11VideoRenderer是一个很好的例子,展示了如何使用基于Dx11的演示者。但是,没有多少代码段来演示如何使用它。
您可以通过以下两种方式进行研究:
无需注册即可使用。
代码段:
typedef HRESULT(_stdcall *PFN_GetClassObject)(REFCLSID, REFIID, LPVOID*);
HMODULE hSink = NULL;
PFN_GetClassObject pfn = NULL;
HRESULT hr = E_FAIL;
IClassFactory *pMediaSinkFactory = NULL;
IMFMediaSink *pMediaSink = NULL;
hSink = ::LoadLibraryEx(L“DX11VideoRenderer.dll”,
NULL,
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
if(hSink)
pfn = (PFN_GetClassObject)GetProcAddress(
hSink,
"DllGetClassObject");
if(pfn)
hr = pfn(CLSID_DX11VideoRenderer,
IID_IClassFactory,
(LPVOID*)&pMediaSinkFactory);
if(pMediaSinkFactory){
pMediaSinkFactory->CreateInstance(NULL,
__uuidof(IMFMediaSink),
(LPVOID*)&pMediaSink);
pMediaSinkFactory->Release();
}