媒体基金会 EVR 和 DirectX 11

Roz*_*are 5 directx-11 ms-media-foundation

我正在尝试在 Windows 10(桌面)上使用 DirectX 11 为 Media Foundation 编写 EVR。到目前为止,我找到的唯一一个解决方案是在这里 不幸的是,我不知道(和其他许多人一样)如何正确使用它。有人可以指出我如何将 MF 与 DirectX 11/12 结合的正确方向吗?

我正在使用激活我的 EVR 的代码:

hr = MFCreateVideoRendererActivate(hwndVideo, &pRendererActivate);
hr = pRendererActivate->SetGUID(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_CLSID, CLSID_DX11VideoRenderer);
Run Code Online (Sandbox Code Playgroud)

我来到了 MF 要求 GetDeviceID 并在 kernel.dll 中引发异常的地步。我认为混合器和渲染器设备之间存在不匹配。它们的默认设备是 DX9。在我的示例中,我必须提供 DirectX 11 设备 CLSID。

小智 1

DX11VideoRenderer 是一个很好的示例,展示了如何使用基于 Dx11 的演示器。然而,没有太多代码片段来演示如何使用它。

\n\n

您可以通过两种方式进行研究:

\n\n
    \n
  1. 使用regsvr32注册编译好的DX11VideoRenderer COM CLSID,并将其添加到TopoEdit中。
  2. \n
  3. 无需注册即可使用。

    \n\n
      \n
    • 对 dll 调用 LoadLibrary()。
    • \n
    • 调用 GetProcAddress() 获取 DllGetClassObject() 的 pfn。
    • \n
    • 使用 CLSID_DX11VideoRenderer 和 IID_IClassFactory 调用上面的 pfn 以检索媒体接收器工厂。
    • \n
    • 使用媒体接收器工厂创建媒体接收器。
    • \n
    • 将媒体接收器添加到拓扑。
    • \n
  4. \n
\n\n

代码片段:

\n\n
typedef HRESULT(_stdcall *PFN_GetClassObject)(REFCLSID, REFIID, LPVOID*);\nHMODULE hSink = NULL;\nPFN_GetClassObject pfn = NULL;\nHRESULT hr = E_FAIL;\nIClassFactory *pMediaSinkFactory = NULL;\nIMFMediaSink *pMediaSink = NULL;\n\nhSink = ::LoadLibraryEx(L\xe2\x80\x9cDX11VideoRenderer.dll\xe2\x80\x9d, \n            NULL, \n            LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);\n\nif(hSink)\n    pfn = (PFN_GetClassObject)GetProcAddress(\n            hSink, \n            "DllGetClassObject");\n\nif(pfn)\n    hr = pfn(CLSID_DX11VideoRenderer, \n            IID_IClassFactory, \n            (LPVOID*)&pMediaSinkFactory);\n\nif(pMediaSinkFactory){\n    pMediaSinkFactory->CreateInstance(NULL, \n        __uuidof(IMFMediaSink), \n        (LPVOID*)&pMediaSink);\n    pMediaSinkFactory->Release();\n}\n
Run Code Online (Sandbox Code Playgroud)\n