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


Изменения динамического формата

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

Когда два фильтра подключаются, они согласовывают тип носителя, который описывает формат данных, которые будет доставлять фильтр вышестоящий. В большинстве случаев тип носителя фиксируется на протяжении всего соединения. Однако DirectShow предоставляет ограниченную поддержку фильтров для изменения типа носителя. Когда фильтр переключает типы мультимедиа, это называется динамическим изменением формата. При написании фильтра DirectShow следует учитывать механизмы динамического изменения формата. Даже если фильтр не поддерживает такие изменения, он должен правильно реагировать, если другой фильтр запрашивает новый формат.

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

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

В противном случае, если граф активен, но рассматриваемые фильтры не поддерживают динамическое повторное подключение контактов, существует три возможных механизма изменения формата:

  • QueryAccept (downstream) используется, если выходной контакт предлагает изменение формата для подчиненного однорангового узла, но только в том случае, если новый формат не требует большего буфера.
  • QueryAccept (upstream) используется, когда входной контакт предлагает изменение формата вышестоящий однорангового узла. Новый формат может иметь тот же размер или быть больше.
  • ReceiveConnection используется, когда выходной контакт предлагает изменение формата подчиненного однорангового узла, а новый формат требует большего буфера.

Обработка изменений формата из отрисовщика видео