默认质量控制

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

DirectShow 基类实现视频质量控制的一些默认行为。

质量消息从呈现器开始。 视频呈现器的基类是 CBaseVideoRenderer,它具有以下行为:

  1. 当视频呈现器收到样本时,它会将样本上的时间戳与当前参考时间进行比较。
  2. 视频呈现器生成质量消息。 在基 类中, 质量消息的比例成员的范围限制为 500 (50%) 到 2000 (200%) 。 超出此范围的值可能会导致质量突然更改。
  3. 默认情况下,视频呈现器将质量消息发送到上游输出引脚 (连接到其输入引脚) 。 应用程序可以通过调用 SetSink 方法替代此行为。

接下来会发生什么取决于上游筛选器。 通常,这是一个转换筛选器。 转换筛选器的基类是 CTransformFilter,它使用 CTransformInputPinCTransformOutputPin 类来实现输入和输出引脚。 这些类共同具有以下行为:

  1. CTransformOutputPin::Notify 方法调用 CTransformFilter::AlterQuality,这是筛选器基类上的私有方法。
  2. 派生筛选器可以替代 AlterQuality 以处理质量消息。 默认情况下, AlterQuality 忽略质量消息。
  3. 如果 AlterQuality 不处理质量消息,输出引脚将调用 CBaseInputPin::P assNotify,这是筛选器输入引脚上的专用方法。
  4. PassNotify 将质量消息传递到适当的位置-下一个上游输出引脚或自定义质量管理器。

假设没有转换筛选器处理质量消息,消息最终会到达源筛选器上的输出引脚。 在基类中, CBasePin::Notify 返回E_NOTIMPL。 特定源筛选器如何处理质量消息取决于源的性质。 某些源(如实时视频捕获)无法执行有意义的质量控制。 其他源可以调整其提供样本的速率。

下图演示了默认行为。

基类中的质量控制

基本视频呈现器实现 IQualityControl::Notify,这意味着你可以将质量消息传递给呈现器本身。 如果将 比例 成员设置为小于 1000 的值,则视频呈现器在呈现的每个帧之间插入一个等待期,实际上会减慢呈现器的速度。 (可以执行此操作以减少系统使用量,例如.) 有关详细信息,请参阅 CBaseVideoRenderer::ThrottleWait。 将 比例 成员设置为大于 1000 的值不起作用。

质量控制管理