流结束通知
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
当源筛选器完成发送数据后,它会在下游输入引脚上调用 IPin::EndOfStream 方法。 下游筛选器将调用传播到下一个筛选器,依此。 当 EndOfStream 调用到达呈现器时,呈现器会将 EC_COMPLETE 事件发送到 Filter Graph 管理器。 如果呈现器具有多个输入引脚,则会在每个输入引脚收到流结束通知后传递EC_COMPLETE事件。
筛选器必须使用其他流式处理调用(如 IMemInputPin::Receive)序列化 EndOfStream 调用。 (换句话说,下游筛选器必须始终按正确的顺序接收调用。)
在某些情况下,下游筛选器可能会在源筛选器检测到流的末尾之前检测到。 (例如,下游筛选器可能正在分析 stream。) 在这种情况下,下游筛选器可以发送流结束通知,在这种情况下,它应从 IMemInputPin::Receive 返回S_FALSE,直到图形停止或刷新。 S_FALSE返回值通知源筛选器停止发送数据。
默认处理EC_COMPLETE
默认情况下,Filter Graph 管理器不会将每个EC_COMPLETE事件转发到应用程序。 相反,它会等待所有流发出EC_COMPLETE信号,然后发送单个EC_COMPLETE事件。 因此,应用程序在完成每个流后接收 事件。
为了确定流的数量,Filter Graph 管理器对支持通过 IMediaSeeking 或 IMediaPosition) 查找 (且具有 呈现 的输入引脚(定义为没有相应输出的输入引脚)的筛选器数进行计数。 Filter Graph 管理器确定是否以以下两种方式之一呈现图钉:
- 引脚的 IPin::QueryInternalConnections 方法在 nPin 参数中返回零。
- 筛选器公开 IAMFilterMiscFlags 接口并返回AM_FILTER_MISC_FLAGS_IS_RENDERER标志。
请求模式下的流结束通知
在 IAsyncReader 连接中,源筛选器不会发送流结束通知。 Instread 中,这由下游筛选器完成,该筛选器通常是分析程序筛选器。 分析程序将 EndOfStream 调用发送到下游。 它不会将一个上游发送到源筛选器。
相关主题