预览项目
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
[此 API 不受支持,将来可能会更改或不可用。]
若要预览项目,请首先调用 CoCreateInstance 以创建基本呈现引擎的实例。 类标识符CLSID_RenderEngine。 然后调用 IRenderEngine::SetTimelineObject 方法来指定要呈现时间线。
首次预览时间线时,请按列出的顺序执行以下调用:
- 调用 IRenderEngine::SetRenderRange 以指定要预览时间线的哪个部分。 (可选)
- 调用 IRenderEngine::ConnectFrontEnd 以生成图形的前端。
- 调用 IRenderEngine::RenderOutputPins。 此方法将每个输出插针连接到视频呈现器或音频呈现器,从而完成图形。
下面的代码示例演示了以下步骤:
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();
现在运行筛选器图。 首先,调用 IRenderEngine::GetFilterGraph 方法以检索指向筛选器关系图管理器的 IGraphBuilder 接口的指针。 然后查询 IMediaControl 接口的筛选器关系图管理器并调用 IMediaControl::Run,如以下代码所示:
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
hr = pRender->GetFilterGraph(&pGraph);
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pControl->Run();
使用 Filter Graph Manager 的 IMediaEventEx 接口等待预览完成。 还可以使用筛选器图管理器的 IMediaSeeking 接口查找图形,就像使用文件播放图一样。
若要再次预览项目,请将图形查找回零点,然后再次调用 Run 。 如果更改时间线的内容,请执行以下操作:
- 调用 SetRenderRange。 (可选)
- 调用 ConnectFrontEnd。
- 如果 ConnectFrontEnd 方法返回S_WARN_OUTPUTRESET,请调用 RenderOutputPins。 (如果 ConnectFrontEnd 返回S_OK,则可以跳过此步骤。)
- 将图形查找回零点。
- 运行图形。
以下示例演示以下步骤:
hr = pRender->ConnectFrontEnd();
if (hr == S_WARN_OUTPUTRESET)
{
hr = pRender->RenderOutputPins();
}
LONGLONG llStart = 0;
hr = pSeek->SetPositions(&llStart, AM_SEEKING_AbsolutePositioning, 0, 0);
hr = pControl->Run();
有关加载和预览项目文件的完整示例,请参阅 加载和预览项目。
相关主题