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


Intelligent Connect

[Функция, связанная с этой страницей 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 ищет фильтр, который может подключиться к предыдущему фильтру. Поток может быть ветвлен, если фильтр подключения имеет несколько выходных контактов. Поиск останавливается, когда каждый поток имеет отрисовщик. Если метод Render зависает, он может создать резервную копию и повторить попытку, используя другой набор фильтров.

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

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

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

  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 для поиска правильного исходного фильтра и render для построения остальной части графа.

IGraphBuilder::Connect

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

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

Фильтрация категорий

Заслуга

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

Создание графа фильтров