다음을 통해 공유


CLSID로 필터 추가

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

다음 함수는 CLSID(지정된 클래스 식별자)를 사용하여 필터를 만들고 필터 그래프에 추가합니다.

// Create a filter by CLSID and add it to the graph.

HRESULT AddFilterByCLSID(
    IGraphBuilder *pGraph,      // Pointer to the Filter Graph Manager.
    REFGUID clsid,              // CLSID of the filter to create.
    IBaseFilter **ppF,          // Receives a pointer to the filter.
    LPCWSTR wszName             // A name for the filter (can be NULL).
    )
{
    *ppF = 0;

    IBaseFilter *pFilter = NULL;
    
    HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pFilter));
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pGraph->AddFilter(pFilter, wszName);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppF = pFilter;
    (*ppF)->AddRef();

done:
    SafeRelease(&pFilter);
    return hr;
}

참고

이 예제에서는 SafeRelease 함수를 사용하여 IBaseFilter 포인터를 해제합니다.

 

함수는 CoCreateInstance 를 호출하여 필터를 만든 다음 IFilterGraph::AddFilter 를 호출하여 그래프에 필터를 추가합니다. 다음 코드 예제에서는 이 함수를 사용하여 그래프에 AVI Mux 필터를 추가합니다.

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL); 
if (SUCCEEDED(hr))
{
    /* ... */
   pMux->Release();
}

일부 필터는 CoCreateInstance를 사용하여 만들 수 없습니다. 다른 소프트웨어 구성 요소를 관리하는 필터가 있는 경우가 많습니다. 예를 들어 AVI 압축기 필터는 비디오 코덱에 대한 래퍼이고 WDM 비디오 캡처 필터는 WDM 캡처 드라이버의 래퍼입니다. 이러한 필터는 시스템 디바이스 열거자 또는 필터 매퍼를 사용하여 만들어야 합니다. 자세한 내용은 디바이스 및 필터 열거를 참조하세요.

일반 Graph-Building 기술