预览项目
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
[此 API 不受支持,将来可能会更改或不可用。]
若要预览项目,需要一个名为呈现引擎的组件,该组件从时间线生成 DirectShow 筛选器图。 筛选器图是实际呈现项目的内容。 可以使用呈现引擎预览项目或写入最终输出文件。
本文不详细介绍呈现引擎。 对于预览版,只需几个方法调用。 可以在 呈现项目中找到更全面的讨论,包括如何编写输出文件。 下面的代码示例演示如何构造预览图。
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
hr = pRender->RenderOutputPins( );
使用 CoCreateInstance 函数创建呈现引擎。 然后在呈现引擎的 IRenderEngine 接口上调用以下方法:
- SetTimelineObject。 指定要使用的时间线。
- ConnectFrontEnd。 生成部分筛选器图,时间线中的每个组都有一个输出引脚。
- RenderOutputPins。 通过将每个输出引脚连接到视频或音频呈现器来完成预览图。
生成图形后,可以通过运行图形来预览项目,就像使用任何 DirectShow 筛选器图一样。 首先,通过调用 IRenderEngine::GetFilterGraph 方法获取指向筛选器图的指针。
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
查询 IMediaControl 和 IMediaEvent 接口的筛选器图。 使用这两个接口运行图形并等待播放完成。 有关如何使用这些接口的说明,请参阅如何播放文件和响应事件。 以下代码演示了使用这些接口的一种方法。
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
long evCode;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
由于 IMediaEvent::WaitForCompletion 方法调用中的 INFINITE 参数,此示例中的代码会阻止程序执行,直到播放完成。 但是,如果在播放过程中出现问题,可能会导致程序停止响应。 在实际应用程序中,使用消息循环等待播放完成。 还建议为用户提供中断播放的方法。
使用完呈现引擎后,请始终调用 IRenderEngine::ScrapIt 方法。 此方法删除筛选器图并释放呈现引擎持有的任何资源。
pRender->ScrapIt();
相关主题