Seek 命令的时间格式

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

IMediaSeeking 接口中的许多方法都具有表示位置值的参数,例如当前位置或停止位置。 默认情况下,这些参数以 100 纳秒为单位表示,也称为参考时间。 任何可以查找的筛选器都必须支持按引用时间查找。 某些筛选器还可以使用其他时间单位进行查找,例如查找特定帧数,或查找流中的给定字节偏移量。 每个时间单位称为时间格式,由全局唯一标识符 (GUID) 定义。 有关 DirectShow 定义的时间格式的列表,请参阅 时间格式 GUID。 第三方还可以为自定义时间格式定义 GUID。

若要确定筛选器图中当前是否支持特定时间格式的筛选器,请调用 IMediaSeeking::IsFormatSupported 方法。 如果支持格式,方法将返回S_OK。 否则,它将返回S_FALSE或错误代码。 如果支持格式,可以通过调用 IMediaSeeking::SetTimeFormat 方法切换到该格式。 如果 SetTimeFormat 方法成功,则后续 seek 命令将使用新的时间格式表示。

以下示例检查图形是否支持按帧编号查找。 如果是这样,它会查找编号 20 的帧:

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // Seek to frame number 20.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

请注意,时间格式仅适用于 seek 命令。 它们不会影响图形播放或其他操作。