Partilhar via


Criando um grafo de filtro VMR-9

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

Como o Filtro do Renderizador de Combinação de Vídeo 9 (VMR-9) não é o renderizador de vídeo padrão, um aplicativo que usa a VMR-9 deve adicioná-lo explicitamente ao grafo e conectá-lo. Esta seção apresenta duas abordagens diferentes para criar grafos de filtro com a VMR-9.

Usando o Construtor de Gráficos de Captura

O Capture Graph Builder é um objeto auxiliar para a criação de grafos de filtro personalizados. Você pode usá-lo para criar grafos VMR-9 da seguinte maneira:

  1. Crie e inicialize o Capture Graph Builder, conforme descrito no tópico Sobre o Construtor de Grafo de Captura.

  2. Chame CoCreateInstance para criar a VMR-9:

    IBaseFilter *pVmr = NULL;
    hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, 
        CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
    
  3. Chame IFilterGraph::AddFilter no Gerenciador de Grafo de Filtro para adicionar a VMR-9 ao grafo de filtro:

    hr = pGraph->AddFilter(pVmr, L"VMR9");
    
  4. Chame IGraphBuilder::AddSourceFilter para adicionar um filtro de origem para o arquivo de vídeo:

    IBaseFilter *pSource;
    hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
    
  5. Chame o método ICaptureGraphBuilder2::RenderStream para renderizar o fluxo de vídeo para a VMR:

    hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);  
    
  6. Opcionalmente, chame RenderStream novamente para renderizar o fluxo de áudio:

    hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
    

Você pode misturar vários fluxos de vídeo chamando AddSourceFilter e RenderStream para cada arquivo de origem.

Usando o Gerenciador de Grafo de Filtro

Se preferir não usar o Capture Graph Builder, você poderá criar um grafo VMR-9 simplesmente usando métodos no Gerenciador de Grafo de Filtro, da seguinte maneira:

  1. Crie a VMR-9 e adicione-a ao grafo, conforme mostrado no procedimento anterior.
  2. Use AddSourceFilter para adicionar um filtro de origem para o arquivo de vídeo, conforme mostrado no procedimento anterior.
  3. Se você quiser renderizar o áudio, crie uma instância do filtro Do Renderizador DirectSound e adicione-a ao grafo de filtro.
  4. Use o método IBaseFilter::EnumPins para localizar um pino de saída no filtro de origem. Consulte Enumerando Pinos para obter detalhes.
  5. Consulte o Gerenciador de Grafo de Filtro para a interface IFilterGraph2.
  6. Chame IFilterGraph2::RenderEx com o sinalizador AM_RENDEREX_RENDERTOEXISTINGRENDERERS. Essa chamada renderiza o pino de saída, usando apenas os filtros de renderizador já no grafo , nesse caso, o VMR-9 e o Renderizador DirectSound. Isso impede que a lógica do Intelligent Connect adicione o renderizador de vídeo padrão ao grafo, o que deixaria a VMR-9 desconectada.

Criando grafos com o Construtor de Grafos de Captura