Поделиться через


Форматы времени для команд seek

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие 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);
    }
}

Обратите внимание, что форматы времени применяются только к командам seek. Они не влияют на воспроизведение графа или другие действия.