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


Шаг 3. Поддержка согласования типов мультимедиа

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

Это шаг 3 учебника Написание фильтров преобразования.

При подключении двух контактов они должны согласовать тип носителя для соединения. Тип носителя описывает формат данных. Без типа носителя фильтр может доставлять данные одного типа, только чтобы другой фильтр обрабатывал их как что-то другое.

Основным механизмом согласования типов мультимедиа является метод IPin::ReceiveConnection . Выходной контакт вызывает этот метод на входном контакте с предлагаемым типом носителя. Входной контакт принимает соединение или отклоняет его. Если подключение отклоняется, выходная закрепка может попробовать другой тип мультимедиа. Если подходящие типы не найдены, подключение завершается ошибкой. При необходимости входной контакт может объявлять список предпочитаемых типов с помощью метода IPin::EnumMediaTypes . Выходной контакт может использовать этот список, когда он предлагает типы мультимедиа, хотя это не обязательно.

Класс CTransformFilter реализует общую платформу для этого процесса следующим образом:

  • Входной контакт не имеет предпочтительных типов мультимедиа. Он полностью зависит от фильтра вышестоящий, чтобы предложить тип носителя. Для видеоданных это имеет смысл, так как тип мультимедиа включает размер изображения и частоту кадров. Как правило, эти сведения должны предоставляться вышестоящий фильтром источника или фильтром средства синтаксического анализа. В случае с звуковыми данными набор возможных форматов меньше, поэтому для закрепления ввода может быть целесообразно предложить некоторые предпочтительные типы. В этом случае переопределите CBasePin::GetMediaType на входном контакте.
  • Когда фильтр вышестоящий предлагает тип носителя, входной контакт вызывает метод CTransformFilter::CheckInputType, который принимает или отклоняет тип.
  • Выходной контакт не будет подключаться, если только входной контакт не будет подключен первым. Такое поведение типично для фильтров преобразования. В большинстве случаев фильтр должен определить тип входных данных, прежде чем он сможет задать тип вывода.
  • Когда выходной контакт подключается, он содержит список типов носителей, которые он предлагает нижестоящему фильтру. Он вызывает метод CTransformFilter::GetMediaType для создания этого списка. Выходной контакт также будет пробовать любые типы мультимедиа, которые предлагает нижестоящий фильтр.
  • Чтобы проверка, совместим ли конкретный тип вывода с типом входных данных, выходной контакт вызывает метод CTransformFilter::CheckTransform.

Три метода CTransformFilter , перечисленные ранее, являются чистыми виртуальными, поэтому производный класс должен реализовывать их. Ни один из этих методов не относится к COM-интерфейсу; они являются просто частью реализации, предоставляемой базовыми классами.

В следующих разделах каждый метод описывается более подробно.

How Filters Connect

Написание фильтров DirectShow