Поделиться через


Использование модуля сопоставления фильтров

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Сопоставитель фильтров — это COM-объект, который перечисляет фильтры DirectShow на основе различных критериев поиска. Средство сопоставления фильтров может быть менее эффективным, чем перечислитель системных устройств, поэтому если вам нужны фильтры из определенной категории, следует использовать перечислитель системных устройств. Но если вам нужно найти фильтр, который поддерживает определенное сочетание типов мультимедиа, но не попадает в категорию с четким вырезом, может потребоваться использовать сопоставителя фильтров. (Примером может быть фильтр отрисовщика или фильтр декодера.)

Фильтр mapper предоставляет интерфейс IFilterMapper2 . Чтобы найти фильтр, вызовите метод IFilterMapper2::EnumMatchingFilters . Этот метод принимает несколько параметров, определяющих условия поиска, и возвращает перечислитель для соответствующих фильтров. Перечислитель поддерживает интерфейс IEnumMoniker и предоставляет уникальный моникер для каждого соответствующего фильтра.

В следующем примере перечислены фильтры, которые принимают цифровое видео (DV) и имеют по крайней мере один выходной контакт любого типа мультимедиа. (Фильтр dv Video Decoder соответствует этим критериям.)

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 , он всегда действует как подстановочный знак или значение "не волнуйся", соответствующее любому фильтру.

Перечисление устройств и фильтров

Intelligent Connect