筛选器链

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

筛选器链 是满足以下条件的筛选器序列:

  • 链中的每个筛选器最多具有一个连接的输入引脚和一个连接的输出引脚。
  • 无需在链外遍历筛选器即可遍历链中的每个筛选器。

例如,在下图中,筛选器 A-B、C–D 和 F–G–H 是筛选器链。 F-G-H(F–G 和 G-H)中的每个子链也是一个筛选器链。 筛选器链可以包含单个筛选器,因此筛选器 A、B、C、D、F、G 和 H 也是不同的筛选器链。 筛选器 E 具有两个输入连接,因此包含筛选器 E 的任何筛选器序列都不是筛选器链。

筛选器链(示例 1)

IFilterChain 接口提供了以下控制筛选器链的方法:

标签 价值
IFilterChain::StartChain 启动链。
IFilterChain::StopChain 停止链。
IFilterChain::P auseChain 暂停链。
IFilterChain::RemoveChain 从图形中删除链。

 

没有用于添加链的特定方法。 若要添加链,请使用 IFilterGraph::AddFilter 方法插入新筛选器。 然后通过调用 IGraphBuilder::ConnectIGraphBuilder::Render或类似方法来连接筛选器。

当图形正在运行时,筛选器链可以在运行和停止之间切换。 当图形暂停时,它可以在暂停和停止之间切换。 这些是筛选器链可能的唯一状态转换。

筛选器链准则

使用 IFilterChain 方法时,请务必确保图形中的筛选器可以支持筛选器链接作。 否则,可能会导致死锁或图形错误。 连接到链的筛选器在链更改状态后必须正常运行。

使用 IFilterChain 的最佳方法是使用专为链接设计的一组筛选器。 使用以下准则确保筛选器对筛选器链作是安全的。 这些点指的是下图。

筛选器链(示例 2)

  • 在筛选器链的状态更改之前,必须完成筛选器链边界上的所有数据处理调用。 此规则适用于 IMemInputPin::ReceiveIPin::NewSegmentIPin::EndOfStream的方法。 链中的筛选器必须从对链外筛选器发出的这些方法的调用返回;链外部的筛选器必须从链内筛选器发出的调用返回。

例如,在上图中,筛选器 B 必须完成来自筛选器 A 的任何数据处理调用,筛选器 E 必须完成来自筛选器 D 的任何调用。如果引脚公开 IPinFlowControlIPinConnection 接口,可以通过调用 IPinFlowControl::BlockIGraphConfig::P ushThroughData 方法推送数据,如 动态重新连接中所述。 筛选器还可能支持用于推送数据的专用方法。

  • 上游筛选器必须期望链的状态发生变化。 例如,在上图中,假设链已停止,但筛选 A 调用 IMemInputPin::Receive。 调用失败,筛选器 A 的响应是停止流式处理。 当应用程序重启链时,它不起作用,因为筛选器 A 不再流式处理数据。
  • 下游筛选器还必须期望链的状态发生变化。 否则,下游筛选器可能会在等待从未到达的样本时阻止。 例如,多路复用器(MUX)筛选器通常需要来自其所有输入引脚的数据。 从一个输入引脚停止数据流可能会阻止其他流进行处理。 这可能会导致图形死锁。
  • 从链外部到链内的筛选器的每个引脚连接都应有自己的分配器,该分配器不会由其他连接共享。 当链更改状态或从图形中删除时,可能会取消分配器。 如果其他连接使用相同的分配器,则它们无法再处理示例。
  • 除非连接到链的筛选器支持动态断开连接,否则不要删除链。 通常,连接的筛选器将支持 IPinConnectionIPinFlowControl 接口,但可能改为支持专用接口。

动态图形生成