设置和检索位置

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

筛选器图维护两个位置值:当前位置和停止位置。 这些定义如下:

  • 当图形运行时,当前位置是相对于源开头的当前播放位置。 当图形停止或暂停时,当前位置是流式处理将在下一个运行命令中开始的点。
  • 停止位置是流的结束点。 当图形到达停止位置时,不再流式传输数据,筛选器图管理器会发布 EC_COMPLETE 事件。 但是, (图形不会自动切换到停止状态。有关详细信息,请参阅 响应事件。)

若要检索这些值,请调用 IMediaSeeking::GetPositions 方法。 返回的值始终相对于原始媒体源。 默认情况下,这些值采用引用时间单位。 在某些情况下,可以更改时间单位;有关详细信息,请参阅 Seek 命令的时间格式

若要查找新位置或设置新的停止位置,请调用 IMediaSeeking::SetPositions 方法,如以下示例所示:

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

注意

一秒是 10,000,000 个单位的参考时间。 为方便起见,此示例将此值定义为ONE_SECOND。 如果使用 DirectShow 基类库,则常量 UNITS 具有相同的值。

 

rtNow 参数指定新的当前位置。 第二个参数是定义如何解释 rtNow 的标志。 在此示例中,AM_SEEKING_AbsolutePositioning标志指示 rtNow 指定源中的绝对位置。 因此,筛选器图将查找距流开始两秒的位置。 rtStop 参数提供停止时间。 最后一个参数指定 rtStop 也是绝对位置。

若要指定相对于上一个位置值的位置,请使用 AM_SEEKING_RelativePositioning 标志。 若要使其中一个位置值保持不变,请使用 AM_SEEKING_NoPositioning 标志。 在这种情况下,相应的时间参数可以为 NULL 。 以下示例向前查找 10 秒,但保持停止位置不变:

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

如果停止筛选图,视频呈现器不会在查找操作后更新图像。 对于用户来说,它看起来好像没有发生搜寻。 若要更新图像,请在查找操作后暂停图形。 暂停图形会提示视频呈现器有一个新的视频帧。 可以使用 IMediaControl::StopWhenReady 方法,该方法暂停图形,然后停止图形。