iMediaSeeking::SetPositions 方法 (strmif.h)

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

方法 SetPositions 设置当前位置和停止位置。

语法

HRESULT SetPositions(
  [in, out] LONGLONG *pCurrent,
  [in]      DWORD    dwCurrentFlags,
  [in, out] LONGLONG *pStop,
  [in]      DWORD    dwStopFlags
);

参数

[in, out] pCurrent

[in,out]指向一个变量的指针,该变量指定当前位置(以当前时间格式的单位为单位)。

[in] dwCurrentFlags

标志的按位组合。 请参阅“备注”。

[in, out] pStop

[in,out]指向指定停止时间的变量的指针,以当前时间格式的单位为单位。

[in] dwStopFlags

标志的按位组合。 请参阅“备注”。

返回值

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

返回代码 说明
S_FALSE
无位置更改。 (这两个标志都指定 no seeking.)
S_OK
成功。
E_INVALIDARG
无效的参数。
E_NOTIMPL
不支持方法。
E_POINTER
NULL 指针参数。

注解

dwCurrentFlagsdwStopFlags 参数定义搜寻的类型。 定义了以下标志。

定位标志 说明
AM_SEEKING_NoPositioning 位置没有变化。 (time 参数可以为 NULL.)
AM_SEEKING_AbsolutePositioning 指定位置为绝对位置。
AM_SEEKING_RelativePositioning 指定位置相对于上一个值。
AM_SEEKING_IncrementalPositioning pStop) (停止位置相对于当前位置 (pCurrent) 。
 
修饰符标志 说明
AM_SEEKING_SeekToKeyFrame 查找到最近的关键帧。 这可能更快,但不太准确。 DirectShow 附带的筛选器均不支持此标志。 解码器是最有可能支持它的筛选器类型。
AM_SEEKING_ReturnTime 返回等效的引用时间。
AM_SEEKING_Segment 使用段查找。
AM_SEEKING_NoFlush 不要刷新。
 

对于每个参数,请使用一个定位标志。 (可选)包括一个或多个修饰符标志。

如果指定了 AM_SEEKING_ReturnTime 标志,该方法会将位置值转换为引用时间,并在 pCurrentpStop 变量中返回它。 如果使用其他时间格式(例如帧),此标志非常有用。

AM_SEEKING_Segment和AM_SEEKING_NoFlush标志支持无缝循环:

  • 如果存在AM_SEEKING_Segment标志,则源筛选器在到达停止位置时发送 EC_END_OF_SEGMENT 事件,而不是调用 IPin::EndOfStream。 应用程序可以等待此事件,然后发出另一个 seek 命令。
  • 如果存在AM_SEEKING_NoFlush标志,则图形不会在查找期间刷新数据。 将此标志用于AM_SEEKING_Segment。
若要执行循环,图形必须在 IMediaSeeking::GetCapabilities 方法中报告AM_SEEKING_CanDoSegments。 目前,只有 WAVE 分析程序筛选器 支持此功能。

pCurrentpStop 的传入值以当前时间格式表示。 默认时间格式为 REFERENCE_TIME 单位 (100 纳秒) 。 若要更改时间格式,请使用 IMediaSeeking::SetTimeFormat 方法。 如果存在AM_SEEKING_ReturnTime标志,该方法会将传出值转换为 REFERENCE_TIME 个单位。

筛选器开发人员

如果实现此方法,可以使用值AM_SEEKING_PositioningBitsMask屏蔽修饰符标志,检查调用方是请求更改当前位置还是停止位置。 例如:
DWORD dwCurrentPos = dwCurrentFlags & AM_SEEKING_PositioningBitsMask
if (dwCurrentPos == AM_SEEKING_AbsolutePositioning)
{ 
    // Set new position to pCurrent.
    m_rtStart = *pCurrent;
}
else if (dwCurrentPos == AM_SEEKING_RelativePositioning)
{
    // Increment current position by pCurrent.
    m_rtStart += *pCurrent;
}
有关详细信息,请参阅基类库中 CSourceSeeking::SetPositions 方法的源代码。

要求

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

另请参阅

错误和成功代码

IMediaSeeking 接口