共用方式為


使用篩選映射器

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基礎架構中的 音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

篩選對應程式 是一個 COM 物件,會根據各種搜尋準則列舉 DirectShow 篩選條件。 篩選器映射器的效率可能不如系統裝置列舉器,因此如果您需要特定類別的篩選器,您應該使用系統裝置列舉器。 但是,如果您需要找出支援特定媒體類型組合的過濾器,但不屬於明確類別,您可能需要使用過濾器映射器。 (例如轉譯器篩選或譯碼器篩選。

篩選對應程式 會顯示 IFilterMapper2 介面。 若要搜尋篩選,請呼叫 IFilterMapper2::EnumMatchingFilters 方法。 此方法會採用數個參數來定義搜尋準則,並傳回比對篩選條件的列舉值。 枚舉器支援 IEnumMoniker 介面,並為每個符合的篩選器提供唯一的 Moniker。

下列範例會列出接受數位視訊(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 參數,它一律會作為通配符或「不關心」值,符合任何篩選條件。

列舉裝置和過濾器

智能連接