Шаг 1. Выбор базового класса

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

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

Если вы решили написать фильтр, а не объект DMO, первым шагом является выбор базового класса для использования. Для фильтров преобразования подходят следующие классы:

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

  • CTransInPlaceFilter предназначен для фильтров, изменяющих данные в исходном буфере, которые также называются фильтрами транс-на месте. Когда фильтр trans-in-place получает образец, он изменяет данные внутри этого образца и доставляет тот же образец ниже. Входной и выходной контакт фильтра всегда подключаются к соответствующим типам мультимедиа.

  • CVideoTransformFilter предназначен в первую очередь для декодеров видео. Он является производным от CTransformFilter, но включает функции для удаления кадров, если подчиненный отрисовщик отстает.

  • CBaseFilter — это универсальный класс фильтра. Все остальные классы в этом списке являются производными от CBaseFilter. Если ни один из них не подходит, вы можете вернуться к этому классу. Однако этот класс также требует больше всего работы с вашей стороны.

  • Важно!

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

     

Для примера кодировщика RLE лучшим выбором является CTransformFilter или CVideoTransformFilter. На самом деле различия между ними в значительной степени являются внутренними, поэтому их легко преобразовать из одного в другой. Так как типы носителей на двух контактах должны отличаться, класс CTransInPlaceFilter не подходит для этого фильтра. В этом примере будет использоваться CTransformFilter.

Далее. Шаг 2. Объявите класс фильтра.

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