预览项目

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

[此 API 不受支持,将来可能会更改或不可用。]

若要预览项目,请首先调用 CoCreateInstance 以创建基本呈现引擎的实例。 类标识符CLSID_RenderEngine。 然后调用 IRenderEngine::SetTimelineObject 方法来指定要呈现时间线。

首次预览时间线时,请按列出的顺序执行以下调用:

  1. 调用 IRenderEngine::SetRenderRange 以指定要预览时间线的哪个部分。 (可选)
  2. 调用 IRenderEngine::ConnectFrontEnd 以生成图形的前端。
  3. 调用 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 。 如果更改时间线的内容,请执行以下操作:

  1. 调用 SetRenderRange。 (可选)
  2. 调用 ConnectFrontEnd
  3. 如果 ConnectFrontEnd 方法返回S_WARN_OUTPUTRESET,请调用 RenderOutputPins。 (如果 ConnectFrontEnd 返回S_OK,则可以跳过此步骤。)
  4. 将图形查找回零点。
  5. 运行图形。

以下示例演示以下步骤:

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

有关加载和预览项目文件的完整示例,请参阅 加载和预览项目

管理视频编辑项目

呈现项目