Menggunakan Pemeta Filter

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Filter Mapper adalah objek COM yang menghitung filter DirectShow berdasarkan berbagai kriteria pencarian. Pemeta Filter bisa kurang efisien daripada Enumerator Perangkat Sistem, jadi jika Anda memerlukan filter dari kategori tertentu, Anda harus menggunakan Enumerator Perangkat Sistem. Tetapi jika Anda perlu menemukan filter yang mendukung kombinasi jenis media tertentu, tetapi tidak termasuk dalam kategori clear-cut, Anda mungkin perlu menggunakan Filter Mapper. (Contohnya adalah filter perender atau filter dekoder.)

Filter Mapper mengekspos antarmuka IFilterMapper2 . Untuk mencari filter, panggil metode IFilterMapper2::EnumMatchingFilters . Metode ini mengambil beberapa parameter yang menentukan kriteria pencarian, dan mengembalikan enumerator untuk filter yang cocok. Enumerator mendukung antarmuka IEnumMoniker , dan menyediakan moniker unik untuk setiap filter yang cocok.

Contoh berikut menghitung filter yang menerima input video digital (DV) dan memiliki setidaknya satu pin output, dari jenis media apa pun. (Filter Dekoder Video DV cocok dengan kriteria ini.)

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

Metode EnumMatchingFilters memiliki sejumlah besar parameter, yang dikomentari dalam contoh. Yang signifikan untuk contoh ini meliputi:

  • Nilai merit minimum: Filter harus memiliki nilai merit di atas MERIT_DO_NOT_USE.
  • Jenis input: Penelepon meneruskan array yang berisi pasangan jenis utama dan subjenis. Hanya filter yang mendukung setidaknya salah satu pasangan ini yang akan cocok.
  • Kecocokan persis: Filter dapat mendaftarkan nilai NULL untuk jenis utama, subjenis, kategori pin, atau sedang. Kecuali Anda menentukan pencocokan yang tepat, nilai NULL bertindak sebagai kartubebas, cocok dengan nilai apa pun yang Anda tentukan. Dengan pencocokan yang tepat, filter harus sama persis dengan kriteria Anda. Namun, jika Anda memberikan parameter NULL dalam kriteria pencarian, parameter tersebut selalu bertindak sebagai nilai kartubebas atau "tidak peduli", cocok dengan filter apa pun.

Menghitung Perangkat dan Filter

Intelligent Connect