Korzystanie z mapowania filtrów
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Maper filtru jest obiektem COM, który wylicza filtry DirectShow na podstawie różnych kryteriów wyszukiwania. Moduł mapowania filtrów może być mniej wydajny niż Systemowy Enumerator Urządzeń, więc jeśli potrzebujesz filtrów z określonej kategorii, powinieneś użyć Systemowego Enumeratora Urządzeń. Jeśli jednak musisz zlokalizować filtr obsługujący określoną kombinację typów multimediów, ale nie należy do jednoznacznej kategorii, może być konieczne użycie Mappera filtrów. (Przykładem może być filtr renderatora lub filtr dekodera).
Mapper filtrów uwidacznia interfejs IFilterMapper2. Aby wyszukać filtr, wywołaj metodę IFilterMapper2::EnumMatchingFilters. Ta metoda przyjmuje kilka parametrów definiujących kryteria wyszukiwania i zwraca moduł wyliczający pasujących filtrów. Moduł wyliczający obsługuje interfejs IEnumMoniker i dostarcza unikatowy pseudonim dla każdego pasującego filtru.
Poniższy przykład wylicza filtry, które akceptują dane wejściowe cyfrowego wideo (DV) i mają co najmniej jedno wyprowadzenie wyjściowe dowolnego typu nośnika. (Filtr DV Video Decoder spełnia te kryteria.)
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();
Metoda EnumMatchingFilters ma dość dużą liczbę parametrów, które są komentowane w tym przykładzie. Istotne w tym przykładzie są następujące:
- Minimalna wartość zasług: filtr musi mieć wartość zasług powyżej MERIT_DO_NOT_USE.
- Typy danych wejściowych: obiekt wywołujący przekazuje tablicę zawierającą pary głównych typów i podtypów. Tylko filtry, które obsługują co najmniej jedną z tych par, będą zgodne.
- Dokładne dopasowanie: filtr może rejestrować wartości NULL dla typu głównego, podtypu, kategorii pinu lub nośnika. Jeśli nie określisz dokładnego dopasowania, wartość null działa jako symbol wieloznaczny, pasując do dowolnej wartości, którą określisz. Przy dokładnym dopasowaniu filtr musi dokładnie odpowiadać twoim kryteriom. Jednak jeśli podasz parametr NULL jako kryterium wyszukiwania, zawsze działa jako symbol wieloznaczny lub wartość 'dowolna', pasując do dowolnego filtra.
Tematy pokrewne