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


Сведения о примерах и распределителях мультимедиа

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

Фильтры доставляют данные по pin-подключениям. Данные перемещаются из выходного контакта одного фильтра на входной контакт другого фильтра. Наиболее распространенным способом доставки данных выходным маркером является вызов метода IMemInputPin::Receive для входных данных, хотя существует и несколько других механизмов.

В зависимости от фильтра память для мультимедийных данных может быть выделена различными способами: в куче, на поверхности DirectDraw, с использованием общей памяти GDI или с помощью другого механизма выделения. Объект, отвечающий за выделение памяти, называется распределителем, который представляет собой COM-объект, предоставляющий интерфейс IMemAllocator .

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

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

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

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

В то время как фильтр использует буфер, он содержит количество ссылок в образце. Распределитель использует счетчик ссылок, чтобы определить, когда он может повторно использовать буфер. Это предотвращает перезапись фильтра буфера, который по-прежнему используется другим фильтром. Пример не возвращается в пул доступных примеров распределителя до тех пор, пока каждый фильтр не выпустит его.

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

Следующие разделы предназначены для разработчиков, которые создают собственные настраиваемые фильтры.

Граф фильтра и его компоненты