筛选器链
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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 的任何筛选器序列都不是筛选器链。
IFilterChain 接口提供用于控制筛选器链的以下方法:
Label | 值 |
---|---|
IFilterChain::StartChain | 启动链。 |
IFilterChain::StopChain | 停止链。 |
IFilterChain::P auseChain | 暂停链。 |
IFilterChain::RemoveChain | 从图中删除链。 |
没有用于添加链的特定方法。 若要添加链,请使用 IFilterGraph::AddFilter 方法插入新筛选器。 然后,通过调用 IGraphBuilder::Connect、 IGraphBuilder::Render 或类似方法连接筛选器。
当图形运行时,筛选器链可以在运行和停止之间切换。 当图形暂停时,它可以在暂停和停止之间切换。 这些是筛选器链唯一可能的状态转换。
筛选器链准则
使用 IFilterChain 方法时,请务必确保图中的筛选器可以支持筛选器链接操作。 否则,可能会导致死锁或图形错误。 在链更改状态后,连接到链的筛选器必须正常运行。
使用 IFilterChain 的最佳方式是使用一组专为链接设计的筛选器。 使用以下准则来确保筛选器对筛选器链操作是安全的。 这些要点参考下图。
- 在筛选器链的状态更改之前,必须完成筛选器链边界上的所有数据处理调用。 此规则适用于 IMemInputPin::Receive、 IPin::NewSegment 和 IPin::EndOfStream 的方法。 链中的筛选器必须从对链外筛选器进行的这些方法的调用返回;和 链外部的筛选器必须从链中的筛选器进行的调用返回。
例如,在上图中,筛选器 B 必须完成来自筛选器 A 的任何数据处理调用,而筛选器 E 必须完成来自筛选器 D 的任何调用。如果引脚公开 IPinFlowControl 和 IPinConnection 接口,可以通过调用 IPinFlowControl::Block 和 IGraphConfig::P ushThroughData 方法通过图形推送数据,如 动态重新连接中所述。 筛选器可能还支持用于推送数据的专用方法。
- 上游筛选器必须预期链的状态会发生更改。 例如,在上图中,假设链已停止,但筛选器 A 调用 IMemInputPin::Receive。 调用失败,筛选器 A 的响应是停止流式处理。 当应用程序重启链时,它不起作用,因为筛选器 A 不再流式处理数据。
- 下游筛选器还必须预期链的状态会发生更改。 否则,下游筛选器可能会在等待从未到达的样本时阻止。 例如,多路复用器 (MUX) 筛选器通常需要来自其所有输入引脚的数据。 从一个输入引脚停止数据流可能会阻止其他流进行处理。 这可能会导致图形死锁。
- 从链外筛选器到链内筛选器的每个引脚连接都应具有其自己的分配器,而其他连接不共享该分配器。 当链更改状态或从图中删除时,分配器可能已取消提交。 如果其他连接使用相同的分配器,则它们无法再处理示例。
- 除非连接到链的筛选器支持动态断开连接,否则请勿删除链。 通常,连接的筛选器将支持 IPinConnection 或 IPinFlowControl 接口,但可能改为支持专用接口。
相关主题