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


Метки времени

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

Метка времени определяет время начала и окончания примера мультимедиа, измеряемое в потоке времени. Метку времени иногда называют временем презентации. При чтении остальной части этой статьи важно помнить, что не во всех форматах метки времени используются одинаково. Например, не все примеры MPEG имеют метку времени. В графах фильтров MPEG метка времени не применяется к каждому кадру, пока они не будут выведены из декодера.

Когда фильтр отрисовщика получает пример, он планирует отрисовку на основе метки времени. Если образец поступает с опозданием или не имеет метки времени, фильтр немедленно отрисовывает образец. В противном случае фильтр ожидает времени начала примера, прежде чем он отрисовывает пример. (Он ожидает время начала, вызывая метод IReferenceClock::AdviseTime .)

Исходные фильтры и фильтры синтаксического анализа отвечают за установку правильных меток времени для обрабатываемых примеров. Используйте следующие рекомендации.

  • Воспроизведение файлов. Первый пример — это метка времени с нулевым временем начала. Последующие метки времени определяются длиной выборки и скоростью воспроизведения, которая сама определяется форматом файла. Фильтр, который анализирует файл, отвечает за вычисление правильных меток времени (например, разделитель AVI).
  • Видео- и аудиозахват: каждый пример имеет метку времени с отметкой времени начала, равного времени потоковой передачи, когда он был захвачен, со следующими оговорками:
    • Видеокадры с контакта предварительного просмотра (в отличие от контакта захвата) не имеют метки времени. Из-за задержки графа видеокадр, помеченный временем захвата, всегда будет приходить с опозданием в отрисовщик видео. Это может привести к тому, что отрисовщик будет удалять кадры в попытке контроля качества. Сведения о контроле качества см. в разделе Управление качеством.
    • Захват звука. Фильтр аудиозахвата использует собственный набор буферов, которые отделены от буферов, используемых аудиодрайвом. Звуковой драйвер заполняет буферы фильтра записи через фиксированные интервалы. Интервал зависит от драйвера, но обычно не превышает 10 миллисекундах. Метки времени в звуковых примерах отражают время, когда драйвер заполнил буферы фильтра аудиозахвата. Это время может быть немного неточным, особенно если приложение использует очень небольшой размер буфера. Однако время мультимедиа будет точно отражать количество примеров звука в буфере.
  • Фильтры мультиплексирования. В зависимости от формата вывода фильтру мультиплексирования может потребоваться создать метки времени, или нет. Например, формат файла AVI использует фиксированную частоту кадров без меток времени, поэтому фильтр AVI Mux предполагает, что выборки поступают примерно в нужное время. Однако если во входящих метках времени отображается разрыв, превышающий один кадр, мультиплекс AVI записывает запись индекса с нулевым размером, чтобы указать на удаленный кадр. При воспроизведении файлов во время выполнения создаются новые метки времени, как описано выше.

Чтобы задать метку времени для примера, вызовите метод IMediaSample::SetTime .

Время мультимедиа

При необходимости фильтр также может указать время мультимедиа для примера. В видеопотоке время мультимедиа представляет номер кадра. В аудиопотоке время мультимедиа представляет номер выборки в пакете. Например, если каждый пакет содержит одну секунду звука с частотой 44,1 кГц, первый пакет имеет нулевое время начала мультимедиа, а время остановки носителя — 44100. В потоке, доступном для поиска, время мультимедиа всегда относительно времени начала потока. Например, предположим, что вы ищете 2 секунды с момента начала видеопотока со 15 кадрами в секунду. Первый образец носителя после поиска имеет метку времени, равную нулю, но время мультимедиа 30.

Фильтры отрисовщика и мультиплексора могут использовать время мультимедиа, чтобы определить, были ли удалены кадры или образцы, путем проверки на наличие пробелов. Однако для задания времени мультимедиа фильтры не требуются. Чтобы задать время мультимедиа для примера, вызовите метод IMediaSample::SetMediaTime .

Время и часы в DirectShow