Поделиться через


Сведения о построителе графов захвата

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Граф фильтра, выполняющий захват видео или звука, называется графом захвата. Графы захвата часто сложнее, чем графы воспроизведения файлов. Чтобы упростить для приложений создание графов захвата, DirectShow предоставляет вспомогательный объект под названием Построитель графов захвата. Конструктор графов захвата предоставляет интерфейс ICaptureGraphBuilder2 , который содержит методы для создания графа захвата и управления им. На следующей схеме показан построитель графов захвата и интерфейс ICaptureGraphBuilder2 .

использование построителя графов захвата

Начните с вызова CoCreateInstance, чтобы создать новые экземпляры построителя захвата графов и диспетчера фильтров Графов. Затем инициализируйте построитель графов захвата, вызвав ICaptureGraphBuilder2::SetFiltergraph с указателем на интерфейс IGraphBuilder диспетчера фильтров графов. Этот процесс представлен на схеме ниже.

инициализация построителя графов захвата

В следующем коде показана вспомогательная функция для выполнения следующих действий:

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
}

В этом разделе, посвященном захвату видео, предполагается, что вы используете построитель графа захвата для создания графа захвата. Однако графы захвата можно создавать полностью с помощью методов IGraphBuilder. Однако этот раздел считается расширенным, и предпочтительнее использовать методы Захвата Граф построителя. Дополнительные сведения см. в разделе Дополнительные разделы по захвату.

Сведения о захвате видео в DirectShow