智能连接
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
智能连接是筛选器图形管理器用于生成筛选器图的机制。 它由多个相关算法组成,这些算法选择筛选器并将其添加到筛选器图。
如果在生成特定筛选器图时遇到问题并想要解决问题,或者正在编写自己的筛选器并想要使其可用于自动图形生成,请阅读本主题。
Intelligent Connect 涉及以下 IGraphBuilder 方法:
- IGraphBuilder::AddSourceFilter
- IGraphBuilder::Render
- IGraphBuilder::RenderFile
- IGraphBuilder::Connect
IGraphBuilder::AddSourceFilter
IGraphBuilder::AddSourceFilter 方法添加可以呈现指定文件的源筛选器。 首先,它会在注册表中查找并匹配协议(如 https://
)、文件扩展名或一组预先确定的 检查字节,这些字节是文件中与特定模式匹配的特定偏移量的字节。 有关详细信息,请参阅 注册自定义文件类型。 假设该方法找到适当的源筛选器,然后创建该筛选器的实例,将其添加到图形,并调用筛选器的 IFileSourceFilter::Load 方法和文件名。
IGraphBuilder::Render
IGraphBuilder::Render 方法生成图形的子节。 它从未连接的输出引脚开始,并可在下游工作,根据需要添加新筛选器。 起始筛选器必须已位于图形中。 在每个步骤中,Render 方法搜索可连接到上一个筛选器的筛选器。 如果连接筛选器具有多个输出引脚,则流可以分支。 当每个流都有呈现器时,搜索将停止。 如果 Render 方法停滞,它可能会使用一组不同的筛选器备份并重试。
若要连接每个输出引脚,Render 方法执行以下作:
如果图钉支持 IStreamBuilder 接口,则 Filter Graph Manager 会将整个进程委托给引脚的 IStreamBuilder::Render 方法。 通过公开此接口,引脚负责生成图形的其余部分,向下呈现器。 但是,很少有引脚支持此接口。
Filter Graph 管理器尝试使用内存中缓存的筛选器(如果有)。 在整个智能连接过程中,筛选器图形管理器可能会从该过程的早期步骤中缓存筛选器。 (另请参阅 动态图形生成。)
如果筛选器图包含任何包含未连接输入引脚的筛选器,筛选器图形管理器接下来会尝试它们。 可以强制 Render 方法通过在 调用 render之前将该筛选器添加到图形来尝试特定筛选器。
从 Windows 7 开始,DirectShow 具有某些媒体子类型的首选筛选器列表。 如果呈现的媒体类型有首选筛选器,筛选器图形管理器会尝试下一个筛选器。 应用程序可以使用 IAMPluginControl 接口修改首选筛选器的列表。 对列表的更改会影响应用程序的当前进程,并在进程结束后被丢弃。
最后,如果未找到合适的筛选器,筛选器图形管理器将使用 IFilterMapper2::EnumMatchingFilters 方法搜索注册表。 它尝试将输出引脚的首选媒体类型与注册表中列出的媒体类型匹配。
每个筛选器注册 优点,该值指示筛选器相对于其他筛选器的最好程度。 EnumMatchingFilters 方法按优点返回筛选器,最小优点为 MERIT_DO_NOT_USE + 1。 它忽略具有 MERIT_DO_NOT_USE 或更少优点的筛选器。 筛选器也分组为 GUID 定义的类别。 类别本身具有优点,EnumMatchingFilters 方法忽略任何具有 MERIT_DO_NOT_USE 或更少优点的类别,即使该类别中的筛选器具有更高的功绩值。
从 Windows 7 开始,DirectShow 包含某些媒体子类型的阻止筛选器列表。 筛选器图形管理器跳过此列表上的筛选器。 应用程序可以使用 IAMPluginControl 接口修改阻止的筛选器列表。 此列表的更改会影响应用程序的当前进程,并在进程结束后被丢弃。
总之,Render 方法按以下顺序尝试筛选器:
- 使用 IStreamBuilder。
- 请尝试缓存的筛选器。
- 尝试在图形中筛选筛选器。
- Windows 7 或更高版本:尝试媒体类型的首选筛选器(如果有)。
- 在注册表中查找筛选器。
IGraphBuilder::RenderFile
IGraphBuilder::RenderFile 方法从文件名生成默认播放图。 在内部,此方法使用 AddSourceFilter 找到正确的源筛选器,Render 生成图形的其余部分。
IGraphBuilder::Connect
IGraphBuilder::Connect 方法将输出引脚连接到输入引脚。 此方法根据需要添加中间筛选器,使用为 Render 方法描述的算法的变体:
- 尝试在筛选器之间直接连接,没有中间筛选器。
- 请尝试缓存的筛选器。
- 尝试在图形中筛选筛选器。
- Windows 7 或更高版本:尝试媒体类型的首选筛选器(如果有)。
- 在注册表中查找筛选器。
相关主题
-
使用 GraphEdit 模拟图形生成