Compartilhar via


Conexão Inteligente

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Intelligent Connect é o mecanismo que o Gerenciador de Grafos de Filtro usa para criar grafos de filtro. Ele consiste em vários algoritmos relacionados que selecionam filtros e os adicionam ao grafo de filtro.

Leia este tópico se você estiver tendo problemas para criar um determinado grafo de filtro e quiser solucionar o problema ou se estiver escrevendo seu próprio filtro e quiser disponibilizá-lo para a criação automática de grafo.

O Intelligent Connect envolve os seguintes métodos dedo IGraphBuilder:

IGraphBuilder::AddSourceFilter

O métodoIGraphBuilder::AddSourceFilter adiciona um filtro de origem que pode renderizar um arquivo especificado. Primeiro, ele examina o registro e corresponde ao protocolo (como https://), à extensão do nome do arquivo ou a um conjunto de bytes de verificação predeterminados , que são bytes em deslocamentos específicos no arquivo que correspondem a determinados padrões. Para obter detalhes, consulte Registrando um tipo de arquivo personalizado. Supondo que o método localize um filtro de origem apropriado, ele cria uma instância desse filtro, adiciona-o ao grafo e chama o método IFileSourceFilter::Load do filtro com o nome do arquivo.

IGraphBuilder::Renderização

O método IGraphBuilder::Renderizar cria uma subseção de um grafo. Ele começa a partir de um pino de saída não conectado e funciona downstream, adicionando novos filtros conforme necessário. O filtro inicial já deve estar no grafo. Em cada etapa, o método Renderizar procura um filtro que possa se conectar ao filtro anterior. O fluxo poderá ramificar se um filtro de conexão tiver vários pinos de saída. A pesquisa é interrompida quando cada fluxo tem um renderizador. Se o método Renderizar ficar preso, ele poderá fazer backup e tentar novamente, usando um conjunto diferente de filtros.

Para conectar cada pino de saída, o método Renderizar faz o seguinte:

  1. Se o pin der suporte à interface IStreamBuilder, o Gerenciador de Grafo de Filtro delegará todo o processo ao método IStreamBuilder::Renderizar do pin. Ao expor essa interface, o pino assume a responsabilidade pela criação do restante do grafo até o renderizador. No entanto, pouquíssimos pinos dão suporte a essa interface.

  2. O Gerenciador de Grafo de Filtro tenta usar filtros armazenados em cache na memória, se houver. Durante o processo de Conexão Inteligente, o Gerenciador de Grafos de Filtro pode armazenar em cache filtros de etapas anteriores no processo. (Além disso, consulte de construção do Gráfico Dinâmico .)

  3. Se o grafo de filtro contiver filtros com pinos de entrada não conectados, o Gerenciador do Grafo de Filtro os tentará em seguida. Você pode forçar o método Renderizar a tentar um filtro específico adicionando esse filtro ao grafo antes de chamar Renderizar.

  4. A partir do Windows 7, o DirectShow tem uma lista de filtros preferenciais para determinados subtipos de mídia. Se houver um filtro preferencial para o tipo de mídia que está sendo renderizado, o Gerenciador de Grafo de Filtro tentará esse filtro em seguida. Um aplicativo pode modificar a lista de filtros preferenciais usando a interfaceIAMPluginControl. As alterações na lista afetam o processo atual do aplicativo e são descartadas após o término do processo.

  5. Por fim, se nenhum filtro adequado tiver sido encontrado, o Gerenciador de Grafos de Filtro pesquisará o registro usando o métodoIFilterMapper2::EnumMatchingFilters. Ele tenta corresponder aos tipos de mídia preferenciais do pino de saída com os tipos de mídia listados no registro.

    Cada filtro é registrado com um de mérito, um valor numérico que indica o quão preferível é o filtro, em relação a outros filtros. O métodoEnumMatchingFiltersretorna filtros por ordem de mérito, com um mérito mínimo de MERIT_DO_NOT_USE + 1. Ele ignora filtros com um mérito de MERIT_DO_NOT_USE ou menos. Os filtros também são agrupados em categorias, definidas por GUID. As próprias categorias têm mérito e o método EnumMatchingFilters ignora qualquer categoria com um mérito de MERIT_DO_NOT_USE ou menos, mesmo que os filtros nessa categoria tenham valores de mérito mais altos.

    A partir do Windows 7, o DirectShow tem uma lista de filtros bloqueados para determinados subtipos de mídia. O Gerenciador de Grafos de Filtro ignora filtros nesta lista. Um aplicativo pode modificar a lista de filtros bloqueados usando a interfaceIAMPluginControl. As alterações nessa lista afetam o processo atual do aplicativo e são descartadas após o término do processo.

Para resumir, o método Renderizar tenta filtros na seguinte ordem:

  1. Use iStreamBuilder.
  2. Experimente filtros armazenados em cache.
  3. Experimente filtros no grafo.
  4. Windows 7 ou posterior: experimente o filtro preferencial para o tipo de mídia, se houver.
  5. Procure filtros no Registro.

IGraphBuilder::RenderFile

O método IGraphBuilder::RenderFile cria um grafo de reprodução padrão a partir de um nome de arquivo. Internamente, esse método usa AddSourceFilter para localizar o filtro de origem correto e Renderizar para criar o restante do grafo.

IGraphBuilder::Connect

O método IGraphBuilder::Connect conecta um pino de saída a um pino de entrada. Esse método adiciona filtros intermediários, se necessário, usando uma variação do algoritmo descrito para o método Renderizar:

  1. Tente uma conexão direta entre os filtros, sem filtros intermediários.
  2. Experimente filtros armazenados em cache.
  3. Experimente filtros no grafo.
  4. Windows 7 ou posterior: experimente o filtro preferencial para o tipo de mídia, se houver.
  5. Procure filtros no Registro.

categorias de filtro

de Mérito

simulando a criação de grafo com graphEdit

criando o de Grafo de Filtro