预览项目

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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);

查询 IMediaControlIMediaEvent 接口的筛选器图。 使用这两个接口运行图形并等待播放完成。 有关如何使用这些接口的说明,请参阅如何播放文件和响应事件。 以下代码演示了使用这些接口的一种方法。

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

加载和预览项目