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


Эталонные часы

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

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

В качестве ссылочных часов может выступать любой объект, предоставляющий интерфейс IReferenceClock . Эталонные часы могут быть предоставлены фильтром DirectShow— обычно отрисовщиком звука, который имеет доступ к аппаратному таймеру. В качестве резервного варианта диспетчер фильтров Graph может использовать системное время.

Номинально эталонные часы измеряют время в 100-наносекундных интервалах, хотя фактическая точность часов может быть меньше. Чтобы получить текущее время часов, вызовите метод IReferenceClock::GetTime . Базовые показатели часов ( время, с которого начинается подсчет) зависят от реализации, поэтому значение, возвращаемое GetTime , не имеет смысла. Имеет значение разница с момента начала работы графа.

Хотя точность ссылочных часов может отличаться, время, возвращаемое методом GetTime , гарантированно увеличивается монотонно. Другими словами, время часов никогда не будет идти назад. Если эталонные часы создают часы из источника оборудования и аппаратные часы переходят назад (например, при корректировке часов), метод GetTime должен продолжать возвращать последнее сообщаемое время до тех пор, пока аппаратные часы не наверстят упущенное. Дополнительные сведения см. в разделе Класс CBaseReferenceClock.

Эталонные часы по умолчанию

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

  • Если приложение выбрало часы (см. ниже), используйте эти часы.
  • Если граф содержит динамический исходный фильтр, поддерживающий IReferenceClock, используйте этот фильтр. Определение динамического источника см. в разделе Динамические источники.
  • Если граф НЕ содержит динамические фильтры источника, используйте любой фильтр в графе, который поддерживает IReferenceClock, начиная с отрисовщиков и рабочих вышестоящий. Предпочитать подключенные фильтры вместо неподключенных фильтров. (Если граф отрисовывает аудиопоток, на этом шаге алгоритма обычно выбирается фильтр отрисовщика звука.)
  • Если фильтр не предоставляет подходящие часы, используйте системные эталонные часы, основанные на системном времени.

Установка эталонных часов

Приложение может выбрать часы, вызвав метод IMediaFilter::SetSyncSource в диспетчере фильтров Графа. Вы должны делать это только в том случае, если у вас есть конкретная причина, чтобы предпочесть другие часы.

Вы можете указать диспетчеру фильтров Graph не использовать ссылочные часы, вызвав SetSyncSource со значением NULL. Например, это можно сделать, чтобы как можно быстрее обработать примеры. Чтобы восстановить эталонные часы по умолчанию, вызовите метод IFilterGraph::SetDefaultSyncSource в диспетчере фильтров Graph.

При изменении ссылочных часов диспетчер фильтров Graph уведомляет каждый фильтр, вызывая его метод IMediaFilter::SetSyncSource . Приложения никогда не должны вызывать этот метод для фильтров.

Настройка часов графа

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