智能连接

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

智能连接是 Filter Graph 管理器用于生成筛选图的机制。 它由多个相关算法组成,这些算法选择筛选器并将其添加到筛选器图中。

如果在生成特定筛选器图时遇到问题并想要解决问题,或者正在编写自己的筛选器并希望使其可用于自动图形生成,请阅读本主题。

智能连接涉及以下 IGraphBuilder 方法:

IGraphBuilder::AddSourceFilter

IGraphBuilder::AddSourceFilter 方法添加可以呈现指定文件的源筛选器。 首先,它会在注册表中查找并匹配协议 (,例如https://) 、文件扩展名或一组预先确定的检查字节,这些字节是文件中特定偏移量与特定模式匹配的字节。 有关详细信息,请参阅 注册自定义文件类型。 假设该方法找到适当的源筛选器,然后创建该筛选器的实例,将其添加到图中,并使用文件名调用筛选器的 IFileSourceFilter::Load 方法。

IGraphBuilder::Render

IGraphBuilder::Render 方法生成图形的子部分。 它从未连接的输出引脚开始,在下游工作,根据需要添加新筛选器。 起始筛选器必须已位于图形中。 在每个步骤中, Render 方法都会搜索可以连接到上一个筛选器的筛选器。 如果连接筛选器有多个输出引脚,则流可以分支。 当每个流都有呈现器时,搜索将停止。 如果 Render 方法卡住,它可能会备份并使用其他一组筛选器重试。

若要连接每个输出引脚, Render 方法将执行以下操作:

  1. 如果图钉支持 IStreamBuilder 接口,则 Filter Graph 管理器会将整个过程委托给引脚的 IStreamBuilder::Render 方法。 通过公开此接口,图钉负责生成图形的其余部分(下至呈现器)。 但是,很少有引脚支持此接口。

  2. Filter Graph 管理器尝试使用内存中缓存的筛选器(如果有)。 在整个智能连接过程中,Filter Graph 管理器可能会缓存过程中早期步骤中的筛选器。 (另请参阅 Dynamic Graph Building.)

  3. 如果筛选器图包含任何具有未连接的输入引脚的筛选器,则筛选器关系图管理器接下来会尝试这些筛选器。 在调用 Render 之前,可以通过将筛选器添加到图形来强制 Render 方法尝试特定筛选器。

  4. 从 Windows 7 开始,DirectShow 具有某些媒体子类型的首选筛选器列表。 如果呈现的媒体类型有首选筛选器,则 Filter Graph 管理器接下来会尝试该筛选器。 应用程序可以使用 IAMPluginControl 接口修改首选筛选器的列表。 对列表的更改会影响应用程序的当前进程,并在进程结束后被丢弃。

  5. 最后,如果未找到合适的筛选器,则 Filter Graph 管理器使用 IFilterMapper2::EnumMatchingFilters 方法搜索注册表。 它会尝试将输出引脚的首选媒体类型与注册表中列出的媒体类型进行匹配。

    每个筛选器都注册有一个 优点,该值是一个数值,该值指示筛选器相对于其他筛选器的可取性。 EnumMatchingFilters 方法按优点顺序返回筛选器,最小优点为 MERIT_DO_NOT_USE + 1。 它忽略具有 MERIT_DO_NOT_USE 或更少优点的筛选器。 筛选器还分组到由 GUID 定义的类别中。 类别本身有优点, EnumMatchingFilters 方法会忽略 MERIT_DO_NOT_USE 或更少优点的任何类别,即使该类别中的筛选器具有更高的优点值。

    从 Windows 7 开始,DirectShow 具有某些媒体子类型的阻止筛选器列表。 Filter Graph 管理器跳过此列表中的筛选器。 应用程序可以使用 IAMPluginControl 接口修改阻止的筛选器列表。 对此列表的更改会影响应用程序的当前进程,并在进程结束后被丢弃。

总之, Render 方法按以下顺序尝试筛选器:

  1. 使用 IStreamBuilder
  2. 尝试缓存的筛选器。
  3. 尝试在图中筛选筛选器。
  4. Windows 7 或更高版本:尝试媒体类型的首选筛选器(如果有)。
  5. 在注册表中查找筛选器。

IGraphBuilder::RenderFile

IGraphBuilder::RenderFile 方法基于文件名生成默认播放图。 在内部,此方法使用 AddSourceFilter 查找正确的源筛选器,并使用 Render 生成图形的其余部分。

IGraphBuilder::Connect

IGraphBuilder::Connect 方法将输出引脚连接到输入引脚。 如果需要,此方法使用 Render 方法所述的算法变体添加中间筛选器:

  1. 尝试在筛选器之间直接连接,但没有中间筛选器。
  2. 尝试缓存的筛选器。
  3. 尝试在图中筛选筛选器。
  4. Windows 7 或更高版本:尝试媒体类型的首选筛选器(如果有)。
  5. 在注册表中查找筛选器。

筛选器类别

优点

使用 GraphEdit 模拟图形生成

生成筛选器图