Использование средства сопоставления фильтров
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен на MediaPlayer, IMFMediaEngineи захват аудио и видео в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
фильтр mapper — это COM-объект, перечисляющий фильтры DirectShow на основе различных критериев поиска. Средство сопоставления фильтров может быть менее эффективным, чем перечислитель системных устройств, поэтому, если вам нужны фильтры из определенной категории, следует использовать перечислитель системных устройств. Но если вам нужно найти фильтр, поддерживающий определенное сочетание типов носителей, но не попадает в четкую категорию, может потребоваться использовать Filter Mapper. (Например, фильтр отрисовщика или фильтр декодировщика.)
Модуль сопоставления фильтров реализует интерфейс IFilterMapper2. Чтобы найти фильтр, вызовите метод IFilterMapper2::EnumMatchingFilters. Этот метод принимает несколько параметров, определяющих критерии поиска, и возвращает перечислитель для соответствующих фильтров. Перечислитель поддерживает интерфейс IEnumMoniker и предоставляет уникальный монникер для каждого соответствующего фильтра.
В следующем примере перечислены фильтры, принимающие цифровое видео (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 в критериях поиска, он всегда выступает в роли подстановочного знака или значения "любое", соответствуя любому фильтру.
Связанные разделы