Dela via


Använda filtermapparen

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Filter Mapper är ett COM-objekt som räknar upp DirectShow-filter baserat på olika sökvillkor. Filtermapparen kan vara mindre effektiv än systemenhetsuppräknaren, så om du behöver filter från en viss kategori bör du använda System Device Enumerator. Men om du behöver hitta ett filter som stöder en viss kombination av medietyper, men inte ingår i en tydlig kategori, kan du behöva använda filtermapparen. (Ett exempel skulle vara ett återgivningsfilter eller ett avkodarfilter.)

Filtermapparen exponerar gränssnittet IFilterMapper2. Om du vill söka efter ett filter anropar du metoden IFilterMapper2::EnumMatchingFilters. Den här metoden tar flera parametrar som definierar sökvillkoren och returnerar en uppräknare för matchande filter. Uppräknaren stöder gränssnittet IEnumMoniker och tillhandahåller en unik moniker för varje matchande filter.

I följande exempel uppräknas filter som accepterar digital video (DV) indata och har minst ett utgångsstift, oavsett medietyp. (Filtret DV Video Decoder matchar dessa kriterier.)

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

Metoden EnumMatchingFilters har ett ganska stort antal parametrar som kommenteras i exemplet. De viktigaste för det här exemplet är:

  • Lägsta meritvärde: Filtret måste ha ett meritvärde över MERIT_DO_NOT_USE.
  • Indatatyper: Anroparen skickar en matris som innehåller par med huvudtyper och undertyper. Endast filter som stöder minst ett av dessa par matchar.
  • Exakt matchning: Ett filter kan registrera NULL- värden för huvudtyp, undertyp, pin-kategori eller medium. Om du inte anger exakt matchning fungerar ett NULL--värde som ett jokertecken som matchar alla värden som du anger. Med exakt matchning måste filtret exakt matcha dina kriterier. Men om du ger en NULL- parameter i sökvillkoren fungerar den alltid som ett jokertecken eller "bryr dig inte"-värde som matchar alla filter.

Enumerera enheter och filter

Intelligent Connect