Share via


필터 매퍼 사용

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

필터 매퍼는 다양한 검색 조건에 따라 DirectShow 필터를 열거하는 COM 개체입니다. 필터 매퍼는 시스템 디바이스 열거자보다 효율이 낮을 수 있으므로 특정 범주의 필터가 필요한 경우 시스템 디바이스 열거자를 사용해야 합니다. 그러나 특정 미디어 형식 조합을 지원하지만 명확한 범주에 속하지 않는 필터를 찾아야 하는 경우 필터 매퍼를 사용해야 할 수 있습니다. (예를 들어 렌더러 필터 또는 디코더 필터가 있습니다.)

필터 매퍼는 IFilterMapper2 인터페이스를 노출합니다. 필터를 검색하려면 IFilterMapper2::EnumMatchingFilters 메서드를 호출합니다 . 이 메서드는 검색 조건을 정의하는 여러 매개 변수를 사용하고 일치하는 필터에 대한 열거자를 반환합니다. 열거자는 IEnumMoniker 인터페이스를 지원하고 일치하는 각 필터에 대해 고유한 모니커를 제공합니다.

다음 예제에서는 DV(디지털 비디오) 입력을 허용하고 미디어 유형의 출력 핀이 하나 이상 있는 필터를 열거합니다. DV 비디오 디코더 필터는 이러한 조건과 일치합니다.

IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;

hr = CoCreateInstance(CLSID_FilterMapper2, 
    NULL, CLSCTX_INPROC, IID_IFilterMapper2, 
    (void **) &pMapper);

if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;

hr = pMapper->EnumMatchingFilters(
        &pEnum,
        0,                  // Reserved.
        TRUE,               // Use exact match?
        MERIT_DO_NOT_USE+1, // Minimum merit.
        TRUE,               // At least one input pin?
        1,                  // Number of major type/subtype pairs for input.
        arrayInTypes,       // Array of major type/subtype pairs for input.
        NULL,               // Input medium.
        NULL,               // Input pin category.
        FALSE,              // Must be a renderer?
        TRUE,               // At least one output pin?
        0,                  // Number of major type/subtype pairs for output.
        NULL,               // Array of major type/subtype pairs for output.
        NULL,               // Output medium.
        NULL);              // Output pin category.

// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
    IPropertyBag *pPropBag = NULL;
    hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
       (void **)&pPropBag);

    if (SUCCEEDED(hr))
    {
        // To retrieve the friendly name of the filter, do the following:
        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        if (SUCCEEDED(hr))
        {
            // Display the name in your UI somehow.
        }
        VariantClear(&varName);

        // To create an instance of the filter, do the following:
        IBaseFilter *pFilter;
        hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
        // Now add the filter to the graph. Remember to release pFilter later.
    
        // Clean up.
        pPropBag->Release();
    }
    pMoniker->Release();
}

// Clean up.
pMapper->Release();
pEnum->Release();

EnumMatchingFilters 메서드에는 상당히 많은 수의 매개 변수가 있으며, 이 매개 변수는 예제에서 주석으로 처리됩니다. 이 예제의 중요한 사항은 다음과 같습니다.

  • 최소 장점 값: 필터에는 MERIT_DO_NOT_USE 이상의 장점 값이 있어야 합니다.
  • 입력 형식: 호출자는 주 형식 및 하위 형식 쌍을 포함하는 배열을 전달합니다. 이러한 쌍 중 하나 이상을 지원하는 필터만 일치합니다.
  • 정확한 일치: 필터는 주 형식, 하위 형식, 핀 범주 또는 매체에 대해 NULL 값을 등록할 수 있습니다. 정확한 일치를 지정하지 않는 한 NULL 값은 지정한 값과 일치하는 와일드카드로 작동합니다. 정확히 일치하면 필터가 조건과 정확히 일치해야 합니다. 그러나 검색 조건에 NULL 매개 변수를 지정하는 경우 항상 와일드카드 또는 "상관 없음" 값으로 작동하며 필터와 일치합니다.

디바이스 및 필터 열거

Intelligent Connect