查找命令的时间格式

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

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

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

以下示例检查图形是否支持按帧编号查找。 如果是这样,它会寻求帧编号 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);
    }
}

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