使用篩選對應程式
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 參數,它一律會作為萬用字元或「不小心」值,以符合任何篩選準則。
相關主題