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


Соединение двух фильтров

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

В этом разделе показаны некоторые вспомогательные функции для подключения фильтров DirectShow.

Чтобы подключить два фильтра, необходимо найти несоединенные выходные контакты в фильтре вышестоящий и несоединенные входные контакты в нисходящем фильтре.

Если у вас уже есть указатели на оба контакта, вызовите метод IGraphBuilder::Connect , чтобы подключить их. Если контакты не могут подключаться друг к другу напрямую, метод IGraphBuilder::Connect может вставить дополнительные фильтры для завершения соединения. Дополнительные сведения см. в разделе Intelligent Connect.

Если у вас есть указатель на фильтры, но не контакты, для поиска контактов необходимо использовать метод IBaseFilter::EnumPins . (См. раздел Перечисление контактов.) Вспомогательные функции в этом разделе демонстрируют этот метод.

Вывод закрепления к фильтру

Следующая функция принимает два параметра: указатель на выходной контакт и указатель на фильтр. Функция подключает выходной контакт к первому доступному входному контакту на фильтре.

// Connect output pin to filter.

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, // Filter Graph Manager.
    IPin *pOut,            // Output pin on the upstream filter.
    IBaseFilter *pDest)    // Downstream filter.
{
    IPin *pIn = NULL;
        
    // Find an input pin on the downstream filter.
    HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pIn->Release();
    }
    return hr;
}

Эта функция выполняет следующие действия:

  1. Вызывает функцию FindUnconnectedPin для получения несоединенного контактного ввода. Эта функция показана в разделе Поиск несоединенного контакта на фильтре.
  2. Вызывает IGraphBuilder::Connect для подключения двух контактов.

Фильтрация по вводу пин-кода

Следующая функция принимает указатель на фильтр и указатель на входной контакт. Он подключает входной контакт к первому доступному выходному контакту на фильтре.

// Connect filter to input pin.

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
    IPin *pOut = NULL;
        
    // Find an output pin on the upstream filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pOut->Release();
    }
    return hr;
}

Фильтрация для фильтрации

Третья функция принимает указатель на фильтр вышестоящий и указатель на подчиненный фильтр и пытается подключить оба фильтра.

// Connect filter to filter

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
    IPin *pOut = NULL;

    // Find an output pin on the first filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        hr = ConnectFilters(pGraph, pOut, pDest);
        pOut->Release();
    }
    return hr;
}

Общие методы Graph-Building

ICaptureGraphBuilder2::RenderStream