Použití mapovače filtru

[Funkce přidružená k této stránce DirectShow je starší funkce. Bylo nahrazeno MediaPlayer, IMFMediaEnginea Audio/Video Capture v Media Foundation. Tyto funkce jsou optimalizované pro Windows 10 a Windows 11. Microsoft důrazně doporučuje, aby nový kód používal MediaPlayer, MMFMediaEngine a Audio/Video Capture v Media Foundation místo DirectShow, pokud je to možné. Microsoft navrhuje, aby se stávající kód, který používá starší rozhraní API, přepsal, aby se nová rozhraní API používala, pokud je to možné.]

Filter Mapper je objekt COM, který vyčísluje filtry DirectShow na základě různých kritérií hledání. Mapovač filtru může být méně účinný než výčet systémových zařízení, takže pokud potřebujete filtry z konkrétní kategorie, měli byste použít enumerátor systémových zařízení. Pokud ale potřebujete najít filtr, který podporuje určitou kombinaci typů médií, ale nepřepadá do kategorie jasně vyříznutých, budete možná muset použít mapovač filtru. (Příkladem může být filtr rendereru nebo dekodérový filtr.)

Mapovač filtru zveřejňuje IFilterMapper2 rozhraní. Chcete-li vyhledat filtr, zavolejte metodu IFilterMapper2::EnumMatchingFilters. Tato metoda přebírá několik parametrů, které definují kritéria hledání, a vrátí enumerátor pro odpovídající filtry. Enumerátor podporuje rozhraní IEnumMoniker a poskytuje jedinečný moniker pro každý odpovídající filtr.

Následující příklad vypíše filtry, které přijímají vstup digitálního videa (DV) a mají alespoň jeden výstupní špendlík libovolného typu média. (Filtr dekodéru videa DV odpovídá těmto kritériím.)

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();

Metoda EnumMatchingFilters má poměrně velký počet parametrů, které jsou komentovány v příkladu. Mezi významné příklady patří:

  • Minimální hodnota zásluh: Filtr musí mít hodnotu zásluh nad MERIT_DO_NOT_USE.
  • Vstupní typy: Volající předá pole obsahující dvojice hlavních typů a podtypů. Budou se shodovat pouze filtry, které podporují alespoň jeden z těchto párů.
  • Přesná shoda: Filtr může registrovat hodnoty NULL pro hlavní typ, podtyp, kategorii pinu nebo medium. Pokud nezadáte přesnou shodu, bude hodnota NULL fungovat jako zástupný znak odpovídající zadané hodnotě. Díky přesné shodě musí filtr přesně odpovídat vašim kritériím. Pokud ale zadáte parametr NULL v kritériích hledání, vždy funguje jako zástupný znak nebo hodnota "nezajímá" odpovídající jakémukoli filtru.

Výčet zařízení a filtrů

Inteligentní Připojení