Compartilhar via


Conexão Inteligente

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo 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 Captura de Áudio/Vídeo 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 Grafo 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 criação automática de grafo.

O Intelligent Connect envolve os seguintes métodos IGraphBuilder :

IGraphBuilder::AddSourceFilter

O método IGraphBuilder::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 de nome de arquivo ou a um conjunto de bytes de marcar 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::Render

O método IGraphBuilder::Render 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 Render 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 Render 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 Render 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::Render do pino. Ao expor essa interface, o pino assume a responsabilidade de criar o 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 todo o processo de Conexão Inteligente, o Gerenciador de Grafo de Filtros pode armazenar em cache filtros de etapas anteriores no processo. (Além disso, consulte Dynamic Graph Building.)

  3. Se o grafo de filtro contiver filtros com pinos de entrada não conectados, o Gerenciador de Grafo de Filtro os tentará em seguida. Você pode forçar o método Render 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 interface IAMPluginControl . 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 Grafo de Filtro pesquisará o registro usando o método IFilterMapper2::EnumMatchingFilters . Ele tenta corresponder os tipos de mídia preferenciais do pino de saída com os tipos de mídia listados no registro.

    Cada filtro é registrado com um mérito, um valor numérico que indica o quão preferível é o filtro, em relação a outros filtros. O método EnumMatchingFilters retorna filtros em 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 pelo 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 Grafo de Filtro ignora os filtros nesta lista. Um aplicativo pode modificar a lista de filtros bloqueados usando a interface IAMPluginControl . 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 Render tenta filtrar 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. Pesquise 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 compilar o restante do grafo.

IGraphBuilder::Connect

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

  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. Pesquise filtros no Registro.

Categorias de Filtro

Mérito

Simulando a criação de grafo com GraphEdit

Criando o grafo de filtro