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


Общие сведения о разработке фильтров DirectShow

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

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

Библиотека базовых классов DirectShow

Пакет SDK DirectShow включает набор классов C++ для записи фильтров. Хотя они и не являются обязательными, эти классы являются рекомендуемыми способами написания нового фильтра. Чтобы использовать базовые классы, скомпилируйте их в статическую библиотеку и свяжите LIB-файл с проектом, как описано в разделе Создание фильтров DirectShow.

Библиотека базовых классов определяет корневой класс для фильтров, класс CBaseFilter . Некоторые другие классы являются производными от CBaseFilter и специализированы для определенных типов фильтров. Например, класс CTransformFilter предназначен для фильтров преобразования. Чтобы создать новый фильтр, реализуйте класс, наследующий от одного из классов фильтра. Например, объявление класса может выглядеть следующим образом:

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

Дополнительные сведения о базовых классах DirectShow см. в следующих разделах:

Создание контактов

Фильтр должен создавать один или несколько контактов. Количество контактов может быть фиксированным во время разработки, или фильтр может создавать новые контакты при необходимости. Закрепление обычно является производным от класса CBasePin или от класса, наследующего CBasePin, например CBaseInputPin. Контакты фильтра должны быть объявлены как переменные-члены в классе фильтра. Некоторые классы фильтров уже определяют контакты, но если фильтр наследуется непосредственно от CBaseFilter, необходимо объявить контакты в производном классе.

Согласование связей контактов

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

  • Transport. Транспорт — это механизм, который фильтры будут использовать для перемещения примеров мультимедиа из выходного контакта во входной контакт. Например, они могут использовать интерфейс IMemInputPin (модель отправки) или интерфейс IAsyncReader (модель извлечения).
  • Тип носителя. Почти все контакты используют типы носителей для описания формата данных, которые они будут доставлять.
  • Распределителя. Распределитель — это объект, который создает буферы, в которые хранятся данные. Контакты должны согласовывать, какой контакт будет предоставлять распределитель. Они также должны согласовать размер буферов, количество создаваемых буферов и другие свойства буфера.

Базовые классы реализуют платформу для этих согласований. Необходимо заполнить подробные сведения, переопределив различные методы в базовом классе. Набор методов, которые необходимо переопределить, зависит от класса и функциональности фильтра. Дополнительные сведения см. в разделе How Filters Connect.

Обработка и доставка данных

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

  • Источник отправки имеет рабочий поток, который непрерывно заполняет образцы данными и доставляет их ниже.
  • Источник по запросу ожидает, пока его подчиненный сосед запросит пример. Он отвечает, записывая данные в образец и доставляя образец в нисходящий фильтр. Нижестоящий фильтр создает поток, который управляет потоком данных.
  • Фильтр преобразования содержит примеры, доставляемые ему соседом вышестоящий. Получив образец, он обрабатывает данные и доставляет их ниже.
  • Фильтр отрисовщика получает образцы из вышестоящий и планирует их отрисовку на основе меток времени.

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

Поддержка COM

Фильтры DirectShow — это COM-объекты, которые обычно упаковываются в библиотеки DLL. Библиотека базовых классов реализует платформу для поддержки COM. Это описано в разделе DirectShow и COM.

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