Partilhar via


Visão geral da criação do Graph

[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.]

Para criar um grafo de filtro, comece criando uma instância do Gerenciador de Grafo de Filtro:

IGraphBuilder* pIGB;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
    (void **)&pIGB);

O Gerenciador de Grafo de Filtro dá suporte aos seguintes métodos de criação de grafo:

  • IFilterGraph::ConnectDirect tenta fazer uma conexão direta entre dois pinos. Se os pinos não puderem se conectar, o método falhará.
  • IGraphBuilder::Connect conecta dois pinos. Se possível, ele faz uma conexão direta. Caso contrário, ele usa filtros intermediários para concluir a conexão.
  • IGraphBuilder::Render inicia a partir de um pino de saída e compila o restante do grafo. Esses métodos adicionam filtros conforme necessário, trabalhando downstream até atingir um filtro de renderizador.
  • IGraphBuilder::RenderFile cria um grafo completo de reprodução de arquivo.
  • IFilterGraph::AddFilter adiciona um filtro ao grafo. Ele não conecta o filtro. Você deve criar o filtro antes de chamar esse método, chamando CoCreateInstance ou usando o Mapeador de Filtro ou o Enumerador de Dispositivo do Sistema.

Esses métodos fornecem três abordagens básicas para criar o grafo:

  1. O Gerenciador de Grafo de Filtro cria todo o grafo.
  2. O Gerenciador de Grafo de Filtro cria parte do grafo.
  3. O aplicativo cria todo o grafo.

O Gerenciador de Grafo de Filtro cria todo o grafo

Se você simplesmente quiser reproduzir um arquivo criado em um formato reconhecido, como AVI, MPEG, WAV ou MP3, use o método RenderFile . O artigo How To Play a File mostra como fazer isso.

O método RenderFile começa procurando no registro um filtro de origem que possa analisar o arquivo. Ele usa o protocolo (como " https:// " na URL), a extensão de arquivo ou padrões de bytes predefinidos no arquivo para determinar o filtro de origem. Para obter detalhes, consulte Registrando um tipo de arquivo personalizado.

Para criar o restante do grafo, o Gerenciador de Grafo de Filtro usa um processo iterativo no qual usa os tipos de mídia compatíveis com um filtro em seus pinos de saída e pesquisa no Registro filtros que aceitarão esse tipo de mídia como entrada. Ele usa vários critérios para restringir a pesquisa e priorizar filtros:

  • A categoria de filtro identifica a funcionalidade geral do filtro.
  • O tipo de mídia descreve que tipo de dados o filtro pode aceitar como entrada ou entrega como saída.
  • O mérito determina a ordem na qual os filtros são testados. Se dois filtros na mesma categoria de filtro derem suporte aos mesmos tipos de entrada, o Gerenciador de Grafo de Filtro selecionará aquele com o valor de mérito mais alto. Alguns filtros recebem propositalmente um valor de baixo mérito porque são projetados para fins especializados e só devem ser adicionados ao grafo pelo aplicativo.

O Gerenciador de Grafo de Filtro usa o objeto Mapper de Filtro para pesquisar o registro.

À medida que cada filtro é adicionado, o Gerenciador de Grafo de Filtro tenta conectá-lo ao pino de saída do filtro anterior. Os filtros negociam para determinar se eles podem se conectar e, em caso afirmativo, qual tipo de mídia usar para a conexão. Se o novo filtro não puder se conectar, o Gerenciador de Grafo de Filtro o descartará e tentará outro filtro. Esse processo continua até que cada fluxo seja renderizado.

O Gerenciador de Grafo de Filtro cria parte do grafo

Para fazer algo além de simplesmente reproduzir um arquivo, seu aplicativo deve executar pelo menos alguns dos trabalhos de construção do grafo. Por exemplo, um aplicativo de captura de vídeo deve selecionar um filtro de origem de captura e adicioná-lo ao grafo. Se você estiver gravando dados em um arquivo AVI, deverá adicionar os filtros AVI Mux e Gravador de Arquivos ao grafo. No entanto, geralmente é possível permitir que o Gerenciador de Grafo de Filtro conclua o grafo. Por exemplo, você pode renderizar um pin para visualização chamando o método Render .

O aplicativo cria o grafo inteiro

Em alguns cenários, seu aplicativo pode precisar criar o grafo adicionando e conectando cada filtro. Nesse caso, você provavelmente sabe especificamente quais filtros devem ser adicionados ao grafo. Com essa abordagem, o aplicativo adiciona cada filtro chamando AddFilter, enumera os pinos nos filtros e os conecta chamando Connect ou ConnectDirect.

Criando grafos com o Construtor de Grafos de Captura

Enumerando dispositivos e filtros

Enumerando objetos em um grafo de filtro

Técnicas gerais de Graph-Building

Criando o grafo de filtro