生成 VMR-9 筛选器图

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

由于视频混合呈现器 9 筛选器 (VMR-9) 不是默认视频呈现器,因此使用 VMR-9 的应用程序必须将其显式添加到图形并将其连接。 本部分介绍使用 VMR-9 生成筛选器图的两种不同方法。

使用捕获图形生成器

捕获图形生成器是用于生成自定义筛选器图的帮助程序对象。 可以使用它生成 VMR-9 图,如下所示:

  1. 创建并初始化捕获图形生成器,如 主题关于捕获图形生成器中所述。

  2. 调用 CoCreateInstance 以创建 VMR-9:

    IBaseFilter *pVmr = NULL;
    hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, 
        CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
    
  3. 在筛选器关系图管理器上调用 IFilterGraph::AddFilter ,将 VMR-9 添加到筛选器图:

    hr = pGraph->AddFilter(pVmr, L"VMR9");
    
  4. 调用 IGraphBuilder::AddSourceFilter 为视频文件添加源筛选器:

    IBaseFilter *pSource;
    hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
    
  5. 调用 ICaptureGraphBuilder2::RenderStream 方法将视频流呈现到 VMR:

    hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);  
    
  6. (可选)再次调用 RenderStream 以呈现音频流:

    hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
    

可以通过为每个源文件调用 AddSourceFilter 和 RenderStream 来混合多个视频流。

使用筛选器关系图管理器

如果不想使用捕获图形生成器,只需使用筛选器关系图管理器上的方法即可生成 VMR-9 图,如下所示:

  1. 创建 VMR-9 并将其添加到图中,如上一过程所示。
  2. 使用 AddSourceFilter 为视频文件添加源筛选器,如上一过程所示。
  3. 如果要呈现音频,请创建 DirectSound 呈现器 筛选器的实例并将其添加到筛选器图。
  4. 使用 IBaseFilter::EnumPins 方法在源筛选器上查找输出引脚。 有关详细信息 ,请参阅枚举 Pin
  5. 查询 IFilterGraph2 接口的 Filter Graph 管理器。
  6. 使用 AM_RENDEREX_RENDERTOEXISTINGRENDERERS 标志调用 IFilterGraph2::RenderEx 。 此调用仅使用图形中已有的呈现器筛选器(在本例中为 VMR-9 和 DirectSound 呈现器)呈现输出引脚。 这可以防止智能连接逻辑将默认视频呈现器添加到图形,这会使 VMR-9 保持未连接状态。

使用捕获图形生成器生成图形