CLSID によるフィルターの追加
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 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 キャプチャ ドライバーのラッパーです。 これらのフィルターは、 システム デバイス列挙子 または フィルター マッパーを使用して作成する必要があります。 詳細については、「 デバイスとフィルターの列挙」を参照してください。
関連トピック