生成 VMR-9 筛选器图
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
由于视频混合呈现器 9 筛选器 (VMR-9) 不是默认视频呈现器,因此使用 VMR-9 的应用程序必须将其显式添加到图形并将其连接。 本部分介绍使用 VMR-9 生成筛选器图的两种不同方法。
使用捕获图形生成器
捕获图形生成器是用于生成自定义筛选器图的帮助程序对象。 可以使用它生成 VMR-9 图,如下所示:
创建并初始化捕获图形生成器,如 主题关于捕获图形生成器中所述。
调用 CoCreateInstance 以创建 VMR-9:
IBaseFilter *pVmr = NULL; hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
在筛选器关系图管理器上调用 IFilterGraph::AddFilter ,将 VMR-9 添加到筛选器图:
hr = pGraph->AddFilter(pVmr, L"VMR9");
调用 IGraphBuilder::AddSourceFilter 为视频文件添加源筛选器:
IBaseFilter *pSource; hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
调用 ICaptureGraphBuilder2::RenderStream 方法将视频流呈现到 VMR:
hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);
(可选)再次调用 RenderStream 以呈现音频流:
hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
可以通过为每个源文件调用 AddSourceFilter 和 RenderStream 来混合多个视频流。
使用筛选器关系图管理器
如果不想使用捕获图形生成器,只需使用筛选器关系图管理器上的方法即可生成 VMR-9 图,如下所示:
- 创建 VMR-9 并将其添加到图中,如上一过程所示。
- 使用 AddSourceFilter 为视频文件添加源筛选器,如上一过程所示。
- 如果要呈现音频,请创建 DirectSound 呈现器 筛选器的实例并将其添加到筛选器图。
- 使用 IBaseFilter::EnumPins 方法在源筛选器上查找输出引脚。 有关详细信息 ,请参阅枚举 Pin 。
- 查询 IFilterGraph2 接口的 Filter Graph 管理器。
- 使用 AM_RENDEREX_RENDERTOEXISTINGRENDERERS 标志调用 IFilterGraph2::RenderEx 。 此调用仅使用图形中已有的呈现器筛选器(在本例中为 VMR-9 和 DirectSound 呈现器)呈现输出引脚。 这可以防止智能连接逻辑将默认视频呈现器添加到图形,这会使 VMR-9 保持未连接状态。
相关主题