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


Установка и получение позиции

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