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
- IGraphBuilder::Renderizar
- IGraphBuilder::RenderFile
- IGraphBuilder::Connect
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:
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.
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 .)
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.
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.
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:
- Use iStreamBuilder.
- Experimente filtros armazenados em cache.
- Experimente filtros no grafo.
- Windows 7 ou posterior: experimente o filtro preferencial para o tipo de mídia, se houver.
- 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:
- Tente uma conexão direta entre os filtros, sem filtros intermediários.
- Experimente filtros armazenados em cache.
- Experimente filtros no grafo.
- Windows 7 ou posterior: experimente o filtro preferencial para o tipo de mídia, se houver.
- Procure filtros no Registro.
Tópicos relacionados
-
simulando a criação de grafo com graphEdit
-
criando o de Grafo de Filtro