Media Foundation EVR和DirectX 11

时间:2017-01-13 14:21:22

标签: directx-11 ms-media-foundation

我正在尝试使用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。

1 个答案:

答案 0 :(得分:0)

DX11VideoRenderer是一个很好的例子,展示了如何使用基于Dx11的演示者。但是,没有多少代码段来演示如何使用它。

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

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

    • 将LoadLibrary()调用到dll。
    • 调用GetProcAddress()获取DllGetClassObject()的pfn。
    • 使用CLSID_DX11VideoRenderer和IID_IClassFactory调用上面的pfn以检索媒体接收器工厂。
    • 使用媒体接收器工厂创建媒体接收器。
    • 将媒体接收器添加到拓扑中。
  3. 代码段:

    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();
    }