实现速率控制

本主题介绍自定义管道对象如何支持可变播放速率,包括反向播放。 有关从应用程序使用速率控制的信息,请参阅 速率控制

本主题包含以下各节:

如果要编写Microsoft Media Foundation 管道对象(媒体源、转换或媒体接收器),则可能需要支持可变播放速率。 为此,请实现以下接口:

  1. 实现 IMFGetService 接口。
  2. 支持MF_RATE_CONTROL_SERVICE服务。 (请参阅 服务接口。)
  3. 实现 IMFRateSupport 接口,该接口获取对象支持的播放速率。
  4. 实现 IMFRateControl 接口,该接口获取或设置播放速率。

媒体源

如果媒体源支持速率控制,它应同时实现 IMFRateSupportIMFRateControl 否则,媒体会话报告最小和最大播放速率为 1.0,而不考虑管道中的其他组件。

播放速率不会影响样本的呈现时间,因此媒体源不应调整其时间戳。 相反,演示时钟以更快的速度运行或速度较慢。 对于反向播放,源按反向顺序提供样本,时间戳会减少。

IMFRateControl::SetRate 方法的 fThin 参数指示媒体源是否应精简内容。 精简主要适用于视频流。 在精简模式下,源会删除增量帧并仅提供关键帧。 在非常高的播放速率下,源可能会跳过一些关键帧(例如,传递所有其他关键帧)。

源不必在精简模式下删除音频样本。 但是,在非常高的播放速率下,源可能无法以足够快的速度读取数据,以填充管道的示例请求。 在这种情况下,源可能需要删除某些音频数据。 如果是这样,它应尝试将接近视频样本的音频样本(假设源具有这两种类型的流)。

当流在精简模式和非精简模式之间切换时,它会发送 MEStreamThinMode 事件。

当媒体源完成对 SetRate 的调用时,它会发送 MESourceRateChanged 事件。

在反向播放期间:

  • 媒体源按相反顺序提供样本,而无需调整时间戳。
  • 流中的时间戳应单调减少。
  • 内容的开头被视为流的末尾。 每个媒体流在流中传递第一个示例(即呈现时间 = 0)后,它会发送 MEEndOfStream 事件。

媒体基础转换

通常,媒体基础转换(MFT)不需要显式支持速率控制,除非 MFT 实现非精简的反向播放。

如果 MFT 未实现 IMFRateSupport 接口,则媒体会话假定以下各项:

  • MFT 支持向前播放的仲裁播放速率,无论是精简播放还是非精简播放。
  • MFT 支持精简的反向播放,但不支持非精简的反向播放。

如果上述任一条件都不正确,MFT 应实施 IMFRateSupportIMFRateControl

反向播放

即使管道中的一个或多个转换不显式支持反向播放,媒体会话也可以反向播放。

如果 MFT 未公开 IMFRateSupport 接口,则媒体会话使用精简进行反向播放,如下所示:

  • 媒体会话通过调用 IMFTransform::P rocessInput,以通常的方式将关键帧发送到 MFT。

  • 媒体会话删除增量帧,并将其替换为 MEStreamTick 事件。

  • 在每个示例之间,媒体会话刷新 MFT,以避免由于时间戳减少而导致的任何错误。

如果示例的 MFSampleExtension_CleanPoint 属性设置为 TRUE,则将其视为关键帧;如果此属性为 FALSE 或未设置,则将其视为增量帧。

如果 MFT 实现 IMFRateSupport,则媒体会话使用此接口来发现 MFT 是否支持非精简的反向播放。 如果 MFT 支持非精简的反向播放,媒体会话会按相反顺序提供所有示例,而无需删除样本或刷新 MFT。

如果 MFT 支持非精简的反向播放,则应实现 IMFRateControl 接口。 媒体会话使用此接口在发生反向播放时通知 MFT。 此时,MFT 必须做好时间戳的准备,以便减少和增量帧以相反的顺序到达。 解码器通常需要缓冲样本,直到收到整组图片(GOP),然后解码整个 GOP,并按正确的(反向)顺序输出解码的帧。

媒体接收器

如果媒体接收器无速率,媒体会话假定媒体接收器可以处理任何播放速率。 媒体接收器不需要实现 IMFRateSupport (无速率媒体接收器从 返回MEDIASINK_RATELESS标志IMFMediaSink::GetCharacteristics 方法。)

否则,如果媒体接收器可以处理 1.0 以外的播放速率,则媒体接收器应实现 IMFRateSupport

媒体接收器不应实现 IMFRateControl 播放速率更改时,演示时钟将调用媒体接收器的 IMFClockStateSink::OnClockSetRate 方法。

速率控制

查找、快速转发和反向播放