根據 CLSID 添加篩選器
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine和媒體基金會中的 音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
下列函式會建立具有指定類別標識碼 (CLSID) 的篩選,並將它新增至篩選圖形:
// Create a filter by CLSID and add it to the graph.
HRESULT AddFilterByCLSID(
IGraphBuilder *pGraph, // Pointer to the Filter Graph Manager.
REFGUID clsid, // CLSID of the filter to create.
IBaseFilter **ppF, // Receives a pointer to the filter.
LPCWSTR wszName // A name for the filter (can be NULL).
)
{
*ppF = 0;
IBaseFilter *pFilter = NULL;
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pFilter));
if (FAILED(hr))
{
goto done;
}
hr = pGraph->AddFilter(pFilter, wszName);
if (FAILED(hr))
{
goto done;
}
*ppF = pFilter;
(*ppF)->AddRef();
done:
SafeRelease(&pFilter);
return hr;
}
注意
此範例會使用 SafeRelease 函式來釋放 IBaseFilter 指標。
函式會呼叫 CoCreateInstance 來建立篩選,然後呼叫 IFilterGraph::AddFilter 將篩選新增至圖形。 下列程式代碼範例會使用此函式將 AVI Mux 篩選新增至圖形:
IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux, NULL);
if (SUCCEEDED(hr))
{
/* ... */
pMux->Release();
}
請注意,某些篩選無法使用 CoCreateInstance來建立。 這通常是負責管理其他軟體元件的篩選器的情況。 例如,AVI 壓縮機 篩選器是視訊編解碼器的包裝函式,而 WDM 視訊擷取 篩選器是 WDM 擷取驅動程式的包裝函式。 這些篩選必須使用 系統裝置列舉值 或 篩選對應程式來建立。 如需詳細資訊,請參閱 列舉裝置和篩選。
相關主題