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


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

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

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

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

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

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

  • указатель на базовый буфер
  • метка времени
  • различные флаги
  • При желании тип носителя

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

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

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

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

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