Подключение двух фильтров

[Функция, связанная с этой страницей, 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