Sobre o Construtor de Gráficos de Captura

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

Um grafo de filtro que executa a captura de áudio ou vídeo é chamado de grafo de captura. Os grafos de captura geralmente são mais complicados do que os grafos de reprodução de arquivos. Para facilitar a criação de grafos de captura para aplicativos, o DirectShow fornece um objeto auxiliar chamado Capture Graph Builder. O Capture Graph Builder expõe a interface ICaptureGraphBuilder2 , que contém métodos para criar e controlar um grafo de captura. O diagrama a seguir ilustra o Capture Graph Builder e a interface ICaptureGraphBuilder2 .

usando o construtor de grafo de captura

Comece chamando CoCreateInstance para criar novas instâncias do Capture Graph Builder e do Gerenciador de Grafo de Filtro. Em seguida, inicialize o Construtor de Grafo de Captura chamando ICaptureGraphBuilder2::SetFiltergraph com um ponteiro para a interface IGraphBuilder do Gerenciador de Gráficos de Filtro. O diagrama a seguir ilustra esse processo.

inicializando o construtor de grafo de captura

O código a seguir mostra uma função auxiliar para executar estas etapas:

HRESULT InitCaptureGraphBuilder(
  IGraphBuilder **ppGraph,  // Receives the pointer.
  ICaptureGraphBuilder2 **ppBuild  // Receives the pointer.
)
{
    if (!ppGraph || !ppBuild)
    {
        return E_POINTER;
    }
    IGraphBuilder *pGraph = NULL;
    ICaptureGraphBuilder2 *pBuild = NULL;

    // Create the Capture Graph Builder.
    HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
    if (SUCCEEDED(hr))
    {
        // Create the Filter Graph Manager.
        hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,
            IID_IGraphBuilder, (void**)&pGraph);
        if (SUCCEEDED(hr))
        {
            // Initialize the Capture Graph Builder.
            pBuild->SetFiltergraph(pGraph);

            // Return both interface pointers to the caller.
            *ppBuild = pBuild;
            *ppGraph = pGraph; // The caller must release both interfaces.
            return S_OK;
        }
        else
        {
            pBuild->Release();
        }
    }
    return hr; // Failed
}

Ao longo desta seção sobre captura de vídeo, supõe-se que você esteja usando o Capture Graph Builder para criar o grafo de captura. No entanto, é possível criar grafos de captura inteiramente usando métodos IGraphBuilder. No entanto, isso é considerado um tópico avançado e os métodos capture graph builder são preferenciais. Para obter mais informações, consulte Tópicos avançados de captura.

Sobre a Captura de Vídeo no DirectShow