Freigeben über


Verwenden der Filterzuordnung

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Der Filter Mapper ist ein COM-Objekt, das DirectShow-Filter basierend auf verschiedenen Suchkriterien auflistet. Die Filterzuordnung kann weniger effizient sein als der Systemgeräteenumerator. Wenn Sie Also Filter aus einer bestimmten Kategorie benötigen, sollten Sie den Systemgeräteenumerator verwenden. Wenn Sie jedoch nach einem Filter suchen müssen, der eine bestimmte Kombination von Medientypen unterstützt, aber nicht in eine eindeutige Kategorie fällt, müssen Sie möglicherweise die Filterzuordnung verwenden. (Ein Beispiel wäre ein Rendererfilter oder ein Decoderfilter.)

Der Filter Mapper macht die IFilterMapper2-Schnittstelle verfügbar. Um nach einem Filter zu suchen, rufen Sie die IFilterMapper2::EnumMatchingFilters-Methode auf. Diese Methode verwendet mehrere Parameter, die die Suchkriterien definieren, und gibt einen Enumerator für die übereinstimmenden Filter zurück. Der Enumerator unterstützt die IEnumMoniker-Schnittstelle und stellt einen eindeutigen Moniker für jeden übereinstimmenden Filter bereit.

Im folgenden Beispiel werden Filter aufgelistet, die digitale Videoeingaben (DIGITAL Video, DV) akzeptieren und über mindestens einen Ausgabepin eines beliebigen Medientyps verfügen. (Der DV-Videodecoderfilter entspricht diesen Kriterien.)

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

Die EnumMatchingFilters-Methode verfügt über eine ziemlich große Anzahl von Parametern, die im Beispiel kommentiert werden. Die wichtigsten für dieses Beispiel sind:

  • Mindestverdienstwert: Der Filter muss einen Wert über MERIT_DO_NOT_USE haben.
  • Eingabetypen: Der Aufrufer übergibt ein Array, das Paare von Haupt- und Untertypen enthält. Nur Filter, die mindestens eines dieser Paare unterstützen, werden übereinstimmen.
  • Genaue Übereinstimmung: Ein Filter kann NULL-Werte für Haupttyp, Untertyp, Anheftkategorie oder Medium registrieren. Sofern Sie keinen genauen Abgleich angeben, fungiert ein NULL-Wert als Wildcard und entspricht einem beliebigen wert, den Sie angeben. Bei exakter Übereinstimmung muss der Filter genau Ihren Kriterien entsprechen. Wenn Sie jedoch einen NULL-Parameter in den Suchkriterien angeben, fungiert er immer als Wildcard- oder "don't care"-Wert, der jedem Filter entspricht.

Auflisten von Geräten und Filtern

Intelligent Connect