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


Интеллектуальное подключение

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

Intelligent Connect — это механизм, который диспетчер фильтров использует для построения графов фильтров. Он состоит из нескольких связанных алгоритмов, которые выбирают фильтры и добавляют их в граф фильтров.

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

Intelligent Connect включает следующие методы IGraphBuilder:

IGraphBuilder::AddSourceFilter

Метод IGraphBuilder::AddSourceFilter добавляет исходный фильтр, который может отобразить указанный файл. Сначала он выглядит в реестре и соответствует протоколу (например, https://), расширению имени файла или набору предопределенных проверять байты, которые являются байтами с определенными смещениями в файле, который соответствует определенным шаблонам. Дополнительные сведения см. в разделе Регистрации пользовательского типа файла. Если метод находит соответствующий исходный фильтр, он создает экземпляр этого фильтра, добавляет его в граф и вызывает метод IFileSourceFilter::Load с именем файла.

IGraphBuilder::Render

Метод IGraphBuilder::Render создает подраздел графа. Он начинается с несоединяемого пин-кода вывода и работает внизу, добавляя новые фильтры по мере необходимости. Начальный фильтр должен быть уже в графе. На каждом шаге метод отрисовки ищет фильтр, который может подключиться к предыдущему фильтру. Поток может ветвь, если в фильтре подключения есть несколько выходных контактов. Поиск останавливается, когда каждый поток содержит отрисовщик. Если метод render зависает, он может создать резервную копию и повторить попытку, используя другой набор фильтров.

Чтобы подключить каждый выходной пин-код, методотрисовкивыполняет следующие действия:

  1. Если пин-код поддерживает интерфейс IStreamBuilder, диспетчер графов фильтров делегирует весь процесс методу IStreamBuilder::Render. Предоставляя этот интерфейс, пин-код несет ответственность за построение оставшейся части графа до отрисовщика. Однако очень мало закреплений поддерживают этот интерфейс.

  2. Диспетчер графов фильтров пытается использовать фильтры, кэшированные в памяти, если таковые имеются. В процессе Intelligent Connect диспетчер графов фильтров может кэшировать фильтры из предыдущих шагов процесса. (См. также динамическое построение графа.)

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

  4. Начиная с Windows 7, DirectShow содержит список предпочтительных фильтров для определенных подтипов мультимедиа. Если есть предпочтительный фильтр для отрисовываемого типа носителя, диспетчер фильтров графов пытается выполнить следующий фильтр. Приложение может изменить список предпочтительных фильтров с помощью интерфейса IAMPluginControl. Изменения в списке влияют на текущий процесс приложения и удаляются после завершения процесса.

  5. Наконец, если не найден подходящий фильтр, диспетчер графов фильтров выполняет поиск в реестре с помощью метода IFilterMapper2::EnumMatchingFilters. Он пытается сопоставить предпочитаемые типы носителей с типами носителей, перечисленными в реестре.

    Каждый фильтр регистрируется в , числовое значение, указывающее, насколько предпочтительнее фильтр, относительно других фильтров. Метод EnumMatchingFilters возвращает фильтры в порядке заслуги с минимальным значением MERIT_DO_NOT_USE + 1. Он игнорирует фильтры с заслугой MERIT_DO_NOT_USE или меньше. Фильтры также группируются в категории, определенные GUID. Категории сами имеют значение, и метод enumMatchingFilters игнорирует любую категорию с заслугой MERIT_DO_NOT_USE или меньше, даже если фильтры в этой категории имеют более высокие значения заслуг.

    Начиная с Windows 7, DirectShow содержит список заблокированных фильтров для определенных подтипов мультимедиа. Диспетчер графов фильтров пропускает фильтры в этом списке. Приложение может изменить список заблокированных фильтров с помощью интерфейса IAMPluginControl. Изменения в этом списке влияют на текущий процесс приложения и удаляются после завершения процесса.

Чтобы свести итоги, метод render пытается выполнить фильтры в следующем порядке:

  1. Используйте IStreamBuilder.
  2. Попробуйте использовать кэшированные фильтры.
  3. Попробуйте использовать фильтры в графе.
  4. Windows 7 или более поздней версии: попробуйте предпочтительный фильтр для типа носителя, если таковой есть.
  5. Поиск фильтров в реестре.

IGraphBuilder::RenderFile

Метод IGraphBuilder::RenderFile создает граф воспроизведения по умолчанию из имени файла. Внутри этого метода используется AddSourceFilter для поиска правильного исходного фильтра и отрисовки для построения остальной части графа.

IGraphBuilder::Connect

Метод IGraphBuilder::Connect подключает выходной пин-код к входному закреплению. Этот метод добавляет промежуточные фильтры при необходимости, используя вариант алгоритма, описанного для метода Render:

  1. Попробуйте прямое подключение между фильтрами без промежуточных фильтров.
  2. Попробуйте использовать кэшированные фильтры.
  3. Попробуйте использовать фильтры в графе.
  4. Windows 7 или более поздней версии: попробуйте предпочтительный фильтр для типа носителя, если таковой есть.
  5. Поиск фильтров в реестре.

категории фильтров

Заслуги

имитация построения графа с помощью GraphEdit

сборке графа фильтров