Graph 生成概述

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

若要创建筛选器关系图,请首先创建筛选器关系图管理器的实例:

IGraphBuilder* pIGB;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
    (void **)&pIGB);

筛选器关系图管理器支持以下图形生成方法:

  • IFilterGraph::ConnectDirect 尝试在两个引脚之间建立直接连接。 如果引脚无法连接,该方法将失败。
  • IGraphBuilder::Connect 连接两个引脚。 如果可能,它会建立直接连接。 否则,它将使用中间筛选器来完成连接。
  • IGraphBuilder::Render 从输出插针开始,并生成图形的其余部分。 此方法根据需要添加筛选器,在下游工作,直到到达呈现器筛选器。
  • IGraphBuilder::RenderFile 生成完整的文件播放图。
  • IFilterGraph::AddFilter 向图形添加筛选器。 它不连接筛选器。 在调用此方法之前,必须通过调用 CoCreateInstance 或使用筛选器映射器或系统设备枚举器来创建筛选器。

这些方法提供了三种构建图形的基本方法:

  1. 筛选器关系图管理器生成整个图形。
  2. 筛选器关系图管理器生成图形的一部分。
  3. 应用程序生成整个图形。

筛选器关系图管理器生成整个图形

如果只想播放以已识别格式(如 AVI、MPEG、WAV 或 MP3)创作的文件,请使用 RenderFile 方法。 如何播放文件一文介绍了如何执行此操作。

RenderFile 方法首先在注册表中查找可分析文件的源筛选器。 它使用协议 ((例如 URL) 中的“ https:// ”“)、文件扩展名或文件中预定义的字节模式来确定源筛选器。 有关详细信息,请参阅 注册自定义文件类型

为了生成图形的其余部分,筛选器关系图管理器使用迭代过程,其中它采用筛选器在其输出引脚上支持的媒体类型,并在注册表中搜索接受该媒体类型作为输入的筛选器。 它使用多个条件来缩小搜索范围并设置筛选器的优先级:

  • 筛选器类别标识筛选器的常规功能。
  • 媒体类型描述筛选器可以接受哪种类型的数据作为输入或作为输出传递。
  • 优点决定了筛选器的尝试顺序。 如果同一筛选器类别中的两个筛选器都支持相同的输入类型,则筛选器关系图管理器会选择具有最高优点值的筛选器。 某些筛选器被特意赋予了较低的优点值,因为它们专为专用用途而设计,并且只能由应用程序添加到图形中。

筛选器关系图管理器使用 筛选器映射器 对象来搜索注册表。

添加每个筛选器时,筛选器关系图管理器会尝试将其连接到上一个筛选器的输出引脚。 筛选器协商以确定它们是否可以连接,如果可以连接,则确定要用于连接的媒体类型。 如果新筛选器无法连接,筛选器关系图管理器将放弃它并尝试另一个筛选器。 此过程一直持续到呈现每个流。

筛选器关系图管理器生成图形的一部分

若要执行除播放文件以外的其他操作,应用程序必须至少执行一些图形生成工作。 例如,视频捕获应用程序必须选择捕获源筛选器并将其添加到图中。 如果要将数据写入 AVI 文件,则必须将 AVI 复用器和文件编写器筛选器添加到图中。 但是,通常可以让筛选器关系图管理器完成图形。 例如,可以通过调用 Render 方法呈现用于预览的图钉。

应用程序生成整个图形

在某些情况下,应用程序可能需要通过添加和连接每个筛选器来生成图形。 在这种情况下,你可能专门知道应将哪些筛选器添加到图中。 使用此方法时,应用程序通过调用 AddFilter 来添加每个筛选器,枚举筛选器上的引脚,并通过调用 ConnectConnectDirect 来连接它们。

使用捕获图形生成器生成图形

枚举设备和筛选器

枚举筛选器图中的对象

常规Graph-Building技术

生成筛选器图