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