다음을 통해 공유


두 필터 연결

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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