IMediaSeeking::SetRate 方法 (strmif.h)

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

方法 SetRate 设置播放速率。

语法

HRESULT SetRate(
  [in] double dRate
);

参数

[in] dRate

播放速率。 不得为零。

返回值

返回 HRESULT 值。 可能的值包括以下值。

返回代码 说明
S_OK
成功。
E_INVALIDARG
指定的速率为零或负值。 (请参阅“备注”。)
E_NOTIMPL
未实现。
E_POINTER
NULL 指针参数。
VFW_E_UNSUPPORTED_AUDIO
音频设备或筛选器不支持此速率。

注解

播放速率表示为正常速度的比率。 因此,1.0 是正常的播放速度,0.5 是半速,2.0 是速度的两倍。 对于音频流,更改速率也会更改音调。

负值表示反向播放。 大多数筛选器不支持负播放,但如果 dRate 参数为负数,则返回错误代码。

当应用程序在筛选器关系图管理器上调用此方法时,筛选器关系图管理器将执行以下操作:

  1. 调用 IMediaSeeking::GetCurrentPosition 方法。 此调用返回筛选器关系图管理器计算的当前位置。
  2. 如果) 暂停或运行筛选器图,则停止筛选器图 (。
  3. 在筛选器上调用 IMediaSeeking::SetPositions 方法,将当前位置作为开始时间。 这会导致将流时间重置为零。
  4. SetRate使用新速率对筛选器调用 方法。
  5. 如果筛选器图已暂停或正在运行,则恢复该图。
如果步骤 4 中发生错误,筛选器关系图管理器会尝试还原以前的速率。

筛选器应按如下所示响应速率更改:

分析器和源筛选器: 源自时间戳的筛选器响应 SetRate 调用。 这通常是分析程序筛选器,例如 AVI 拆分器筛选器,但它可能是源筛选器。 任何查找或速率更改后,筛选器应使用新设置调用 IPin::NewSegment 方法。 速率更改后,它应相应地调整其时间戳。 由于速率更改之前是查找,因此时间戳从零开始重启,因此筛选器只需除以速率即可计算新的时间戳。

解码器筛选器: 解码器不应对SetRate调用执行操作,只应将它们传递给上游。 相反,它们应响应上游分析程序发出的 NewSegment 调用。 当解码器筛选器收到新的段信息时,它应存储值并将 NewSegment 调用传递到下游。 某些解码器需要通过内插其输入来生成额外的时间戳;这样做时,它们应考虑到速率变化。

呈现器: 视频呈现器通常可以忽略速率更改,因为传入帧已具有正确的时间戳。 音频呈现器必须修改其播放速率,因为音频解码器通常不进行速率更改转换。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 strmif.h (包括 Dshow.h)
Library Strmiids.lib

另请参阅

错误和成功代码

IMediaSeeking 接口