Эталонные часы
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Одной из функций диспетчера графов фильтров является синхронизация всех фильтров в графе с одинаковыми часами, называемыми эталонными часами.
Любой объект, предоставляющий интерфейс IReferenceClock, может выступать в качестве эталонных часов. Эталонные часы могут предоставляться фильтром DirectShow, как правило, отрисовщиком звука, который имеет доступ к аппаратному таймеру. В качестве резервного варианта диспетчер графов фильтров может использовать системное время.
Номинально эталонные часы измеряет время в 100-наносекундах интервалов, хотя фактическая точность часов может быть меньше. Чтобы получить текущее время часов, вызовите метод IReferenceClock::GetTime. Базовые показатели часов — время начала подсчета — зависит от реализации, поэтому значение, возвращаемое GetTime, не имеет смысла. Что важно, разностно от момента запуска графа.
Хотя точность эталонных часов может отличаться, время, возвращаемое методом getTime, гарантированно увеличивается монотонно. Другими словами, время часов никогда не будет идти назад. Если эталонные часы создают время из источника оборудования, а аппаратные часы переходят назад (например, если есть корректировка на часы ), метод getTime должен продолжать возвращать последнее указанное время до тех пор, пока аппаратные часы не поднимаются. Дополнительные сведения см. в классе CBaseReferenceClock.
эталонные часы по умолчанию
Диспетчер графов фильтров автоматически выбирает эталонные часы при запуске графа. Он использует следующий алгоритм для выбора часов:
- Если приложение выбрало часы (см. ниже), используйте эти часы.
- Если граф содержит динамический фильтр источника, поддерживающий IReferenceClock, используйте этот фильтр. Определение динамического источника см. в разделе Live Sources.
- Если граф не содержит динамические исходные фильтры, используйте любой фильтр в графе, который поддерживает IReferenceClock, начиная с отрисовщиков и работы вышестоящего потока. Предпочитайте подключенные фильтры через неподключенные фильтры. (Если граф отрисовывает аудиопоток, этот шаг в алгоритме обычно выбирает фильтр отрисовщика звука.)
- Если фильтр не предоставляет подходящие часы, используйте системные справочные часы, которая основана на системном времени.
настройка часов ссылки
Приложение может выбрать часы, вызвав метод IMediaFilter::SetSyncSource в диспетчере графов фильтра. Это следует сделать только в том случае, если у вас есть определенная причина, чтобы предпочесть другое время.
Диспетчер графов фильтров позволяет не использовать эталонные часы, вызвав SetSyncSource со значением NULL. Например, это можно сделать, чтобы как можно быстрее обработать примеры. Чтобы восстановить часы ссылок по умолчанию, вызовите метод IFilterGraph::SetDefaultSyncSource в диспетчере графов фильтров.
При каждом изменении часов ссылки диспетчер Graph уведомляет каждый фильтр, вызывая его метод IMediaFilter::SetSyncSource. Приложения никогда не должны вызывать этот метод в фильтрах.
Связанные разделы
-
настройка часов графа