DirectShow での DMU の使用
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
DirectShow に基づくアプリケーションでは、 DMO ラッパー フィルターを使用して、フィルター グラフで DMO を使用できます。 このフィルターは DMO を集計し、DMO との間でデータを渡す、 IMediaBuffer オブジェクトを割り当てるなど、DMO の使用に関するすべての詳細を処理します。
DMO はフィルターによって集計されるため、アプリケーションは、DMO が公開するすべての COM インターフェイスのフィルターに対してクエリを実行できます。 ただし、アプリケーションでは、DMO に対するすべてのストリーミング操作をフィルターで処理できるようにする必要があります。 たとえば、メディアの種類を設定したり、バッファーを処理したり、DMO をフラッシュしたり、DMO をロックしたり、品質管理を有効または無効にしたり、ビデオの最適化を設定したりしないでください。
使用する特定の DMO のクラス識別子 (CLSID) がわかっている場合は、次のように、その DMO で DMO ラッパー フィルターを初期化できます。
- CoCreateInstance を呼び出して、DMO ラッパー フィルターを作成します。
- IDMOWrapperFilter インターフェイスの DMO ラッパー フィルターに対してクエリを実行します。
- IDMOWrapperFilter::Init メソッドを呼び出します。 DMO の CLSID と DMO のカテゴリの GUID を指定します。 DMO カテゴリの一覧については、「 DMO GUID」を参照してください。
これらの手順を示すコードは次のようになります。
// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
CLSCTX_INPROC_SERVER, IID_IBaseFilter,
reinterpret_cast<void**>(&pFilter));
if (SUCCEEDED(hr))
{
// Query for IDMOWrapperFilter.
IDMOWrapperFilter *pDmoWrapper;
hr = pFilter->QueryInterface(IID_IDMOWrapperFilter,
reinterpret_cast<void**>(&pDmoWrapper));
if (SUCCEEDED(hr))
{
// Initialize the filter.
hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT);
pDmoWrapper->Release();
if (SUCCEEDED(hr))
{
// Add the filter to the graph.
hr = pGraph->AddFilter(pFilter, L"My DMO");
}
}
pFilter->Release();
}
DMOEnum 関数は、レジストリ内の DMO を列挙します。 この関数は、DirectShow フィルターに使用されるカテゴリ GUID とは異なるセットのカテゴリ GUID を使用します。
DMU でのシステム デバイス列挙子の使用
DMO を直接作成する代わりに、DMOEnum メソッドでサポートされている任意の DMO カテゴリを列挙できるシステム デバイス列挙子を使用できます。 システム デバイス列挙子には、特定の DirectShow フィルター カテゴリを列挙する場合も、DMU が含まれます。 次の表は、DMO カテゴリと DirectShow カテゴリ間のマッピングを示しています。
Label | 値 |
---|---|
DMO カテゴリ | DirectShow の同等の表示 |
DMOCATEGORY_AUDIO_ENCODER | CLSID_AudioCompressorCategory |
DMOCATEGORY_AUDIO_DECODER | CLSID_LegacyAmFilterCategory |
DMOCATEGORY_VIDEO_ENCODER | CLSID_VideoCompressorCategory |
DMOCATEGORY_VIDEO_DECODER | CLSID_LegacyAmFilterCategory |
システム デバイス列挙子はモニカー オブジェクトの一覧を返します。 モニカーが DMO を表す場合、 IMoniker::BindToObject メソッドは DMO ラッパー フィルターを自動的に作成し、その DMO で初期化します。 したがって、DMO が関係しているという事実は、アプリケーションに対して透過的です。 システム デバイス列挙子の使用方法の詳細については、「システム デバイス列挙 子の使用」を参照してください。
制限事項
DirectShow で DMU を使用する場合は、いくつかの制限があります。
- DMO ラッパー フィルターは、0 個の入力、複数の入力、または 0 個の出力を持つ DMO をサポートしていません。
- DMO ラッパー フィルター上のすべてのピン接続では、 IMemInputPin インターフェイスが使用されます。
- DirectShow Editing Services では、DMO ベースの効果や切り替えはサポートされていません。
関連トピック