重新连接引脚

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

在引脚连接期间,筛选器可以断开连接并重新连接其其他引脚之一,如下所示:

  1. 筛选器对另一个筛选器的引脚调用 IPin::QueryAccept ,并指定新媒体类型。
  2. 如果 QueryAccept 返回S_OK,筛选器将调用 IFilterGraph2::ReconnectEx 来重新连接引脚。

下面是筛选器何时可能需要重新连接引脚的一些示例:

  • Tee 筛选器。 TE 筛选器将输入流拆分为多个输出,而无需更改流中的数据。 发条筛选器可以接受一系列媒体类型,但这些类型必须在所有引脚连接之间匹配。 因此,当输入引脚连接时,筛选器可能需要重新协商输出引脚上的任何现有连接,反之亦然。 有关示例,请参阅 InfTee 筛选器示例
  • 就地转换筛选器。 换位筛选器修改原始缓冲区中的输入数据,而不是将数据复制到单独的输出缓冲区。 转接筛选器必须对上游和下游连接使用相同的分配器。 用于连接 (输入或输出的第一个引脚) 以通常的方式协商分配器。 但是,当另一个引脚连接时,第一个分配器可能不可接受。 在这种情况下,第二个引脚选择不同的分配器,第一个引脚使用新的分配器重新连接。 有关示例实现,请参阅 CTransInPlaceFilter 类。

ReconnectEx 方法中,Filter Graph 管理器异步断开连接并重新连接引脚。 除非 QueryAccept 返回S_OK,否则筛选器不得尝试重新连接。 否则,引脚将断开连接,从而导致图形错误。 此外,筛选器应从同一线程上的 IPin::Connect 方法内部请求重新连接。 如果 Connect 方法在一个线程上返回,而另一个线程发出重新连接请求,则 Filter Graph 管理器可能会在重新连接之前运行图形,从而导致图形错误。