默认质量控制

[与此页面关联的功能(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 的值不起作用。

Quality-Control 管理