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


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

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

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

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

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

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

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

media Times

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

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

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