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


Метод IMediaSeeking::SetPositions (strmif.h)

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

Комментарии

Параметры dwCurrentFlags и dwStopFlags определяют тип поиска. Определены следующие флаги.

Флаги позиционирования Описание
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, метод преобразует значение позиции в время ссылки и возвращает его в переменной pCurrent или pStop . Этот флаг полезен, если используется другой формат времени, например кадры.

Флаги AM_SEEKING_Segment и AM_SEEKING_NoFlush поддерживают простой цикл:

  • Если флаг AM_SEEKING_Segment присутствует, фильтр источника отправляет событие EC_END_OF_SEGMENT при достижении позиции остановки вместо вызова IPin::EndOfStream. Приложение может ожидать этого события, а затем выполнить другую команду seek.
  • Если флаг AM_SEEKING_NoFlush присутствует, граф не очищает данные во время поиска. Используйте этот флаг с AM_SEEKING_Segment.
Для выполнения циклического выполнения граф должен сообщать о AM_SEEKING_CanDoSegments в методе IMediaSeeking::GetCapabilities . В настоящее время эту функцию поддерживает только фильтр синтаксического анализатора WAVE .

Входящие значения pCurrent и pStop выражаются в формате текущего времени. Формат времени по умолчанию — 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
Header strmif.h (включая Dshow.h)
Библиотека Strmiids.lib

См. также раздел

Коды ошибок и успешного выполнения

Интерфейс IMediaSeeking