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


Сведения о фильтрах DirectShow

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

DirectShow использует модульную архитектуру, в которой каждый этап обработки выполняется с помощью COM-объекта, называемого фильтром. DirectShow предоставляет набор стандартных фильтров для использования приложениями, и разработчики могут создавать собственные настраиваемые фильтры, расширяющие функциональные возможности DirectShow. Ниже приведены шаги, необходимые для воспроизведения видеофайла AVI, а также фильтры, которые выполняют каждый шаг:

  • Чтение необработанных данных из файла в виде потока байтов (фильтр источника файла).
  • Изучите заголовки AVI и разведите поток байтов на отдельные видеокадры и примеры звука (фильтр разделителя AVI).
  • Декодирование видеокадров (различные фильтры декодера в зависимости от формата сжатия).
  • Рисование видеокадров (фильтр отрисовщика видео).
  • Отправьте примеры звука в карта звука (фильтр устройства DirectSound по умолчанию).

Эти фильтры показаны на следующей схеме.

Диаграмма фильтра для воспроизведения AVI-файла со сжатым видео

Как показано на схеме, каждый фильтр подключен к одному или нескольким другим фильтрам. Точки подключения также являются COM-объектами, называемыми контактами. Фильтры используют контакты для перемещения данных из одного фильтра в другой. Стрелки на схеме показывают направление перемещения данных. В DirectShow набор фильтров называется графом фильтров.

Фильтры имеют три возможных состояния: запущено, остановлено и приостановлено. При выполнении фильтра он обрабатывает данные мультимедиа. После остановки обработка данных прекращается. Приостановленное состояние используется для получения данных перед выполнением; В разделе, Поток данных в графе фильтров, эта концепция описана более подробно. За редкими исключениями изменения состояния координируются во всем графе фильтров; все фильтры в графе переключаются состояния в унисон. Таким образом, весь граф фильтра также считается запущенным, остановленным или приостановленным.

Фильтры можно сгруппировать в несколько широких категорий:

  • Фильтр источника вводит данные в граф. Данные могут поступать из файла, сети, камеры или из любого другого места. Каждый фильтр источника обрабатывает разные типы источников данных.
  • Фильтр преобразования принимает входной поток, обрабатывает данные и создает поток вывода. Кодировщики и декодеры являются примерами фильтров преобразования.
  • Фильтры отрисовщика находятся в конце цепочки. Они получают данные и представляют их пользователю. Например, отрисовщик видео рисует видеокадры на дисплее; отрисовщик звука отправляет звуковые данные в звуковой карта, а фильтр записи файлов записывает данные в файл.
  • Фильтр разделения разделяет входной поток на два или более выходных данных, обычно анализируя входной поток по пути. Например, разделитель AVI анализирует поток байтов на отдельные видео- и аудиопотоки.
  • Фильтр мультиплексирования принимает несколько входных данных и объединяет их в один поток. Например, мультиплекс AVI выполняет обратную операцию разделителя AVI. Он принимает аудио- и видеопотоки и создает поток байтов в формате AVI.

Различия между этими категориями не являются абсолютными. Например, фильтр "Читатель ASF" выступает как фильтр источника и фильтр разделения.

Все фильтры DirectShow предоставляют интерфейс IBaseFilter , а все контакты — интерфейс IPin . DirectShow также определяет многие другие интерфейсы, поддерживающие более конкретные функциональные возможности.

Сведения о диспетчере фильтров графов

Поток данных в графе фильтров

Фильтры DirectShow