ハードウェア デバイスがフィルター グラフに参加する方法
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
この記事では、DirectShow がオーディオおよびビデオ ハードウェアと対話する方法について説明します。
ラッパー フィルター
すべての DirectShow フィルターは、ユーザー モードのソフトウェア コンポーネントです。 ビデオ キャプチャ カードなどのカーネル モード ハードウェア デバイスを DirectShow フィルター グラフに参加させるには、デバイスをユーザー モード フィルターとして表す必要があります。 この関数は、DirectShow で提供される特殊な "ラッパー" フィルターによって実行されます。 これらのフィルターには、 オーディオ キャプチャ フィルター、 VFW キャプチャ フィルター、 TV チューナー フィルター、 テレビ オーディオ フィルター、 アナログ ビデオ クロスバー フィルターが含まれます。 DirectShow には、任意の種類の Windows ドライバー モデル (WDM) ストリーミング デバイスを表すことができる KsProxy というフィルターも用意されています。 ハードウェア ベンダーは、KsProxy によって集計された COM オブジェクトである Ksproxy プラグインを提供することで、KsProxy を拡張してカスタム機能をサポートできます。
ラッパー フィルターは、デバイスの機能を表す COM インターフェイスを公開します。 アプリケーションでは、これらのインターフェイスを使用して、フィルターとの間で情報を渡します。 このフィルターは、COM メソッドの呼び出しをデバイス ドライバー呼び出しに変換し、その情報をカーネル モードでドライバーに渡し、結果をアプリケーションに変換します。 TV チューナー、TV オーディオ、アナログ ビデオ クロスバー、KsProxy フィルターは、 IKsPropertySet インターフェイスを介してカスタム ドライバー プロパティをサポートします。 VFW キャプチャ フィルターとオーディオ キャプチャ フィルターは、このように拡張できません。
アプリケーション開発者の場合、ラッパー フィルターを使用すると、他の DirectShow フィルターを制御するのと同じように、アプリケーションでデバイスを制御できます。 特別なプログラミングは必要ありません。カーネル モード デバイスとの通信の詳細は、フィルター内にカプセル化されます。
Windows デバイスのビデオ
VFW キャプチャ フィルターでは、以前の Windows 用ビデオ (VfW) キャプチャ カードがサポートされています。 VfW カードがターゲット システムに存在する場合は、DirectShow システム デバイス列挙子を使用して検出し、フィルター グラフに追加できます。 詳細については、「 デバイスとフィルターの列挙」を参照してください。
オーディオ キャプチャとミキシング デバイス (サウンド カード)
新しいサウンド カードには、マイクやその他の種類のデバイス用の入力ジャックがあります。 通常、これらのカードには、個々の入力のボリューム、高音、およびベースを制御するためのオンボードミキシング機能もあります。 DirectShow では、サウンド カードの入力とミキサーがオーディオ キャプチャ フィルターによってラップされます。 各サウンド カードは、システム デバイス列挙子を使用して検出できます。 システムのサウンド カードを表示するには、GraphEdit を実行し、[オーディオ キャプチャ ソース] カテゴリからを選択します。 そのカテゴリの各フィルターは、オーディオ キャプチャ フィルターの個別のインスタンスです。 ( 「GraphEdit の使用」を参照)。
WDM ストリーミング デバイス
新しいハードウェア デコーダーとキャプチャ カードは、Windows ドライバー モデル (WDM) の仕様に準拠しています。 これらのデバイスは、VfW デバイスよりも大きな機能を持ちます。 WDM ビデオ キャプチャ カードでは、キャプチャ形式の列挙、色相や明るさなどのビデオ パラメーターのプログラムによる制御、プログラムによる入力選択、TV チューナーのサポートなど、VfW では使用できない機能をサポートできます。
WDM ストリーミング デバイスをサポートするために、DirectShow には KsProxy フィルター (ksproxy.ax) が用意されています。 KsProxyは非常に多くの異なるものを行うので、"スイスアーミーナイフフィルタ"と呼ばれています。 フィルター上のピンの数と、フィルターによって公開される COM インターフェイスの数は、基になるドライバーの機能によって異なります。 KsProxy は、"KsProxy" という名前のフィルター グラフには表示されません。常に、レジストリにあるデバイスのフレンドリ名を受け取ります。 システム上の WDM デバイスを表示するには、GraphEdit を実行し、WDM ストリーミング カテゴリから選択します。 システムに WDM カードが 1 つしかない場合でも、そのカードに複数のデバイスが含まれている可能性があります。 各デバイスは個別のフィルターとして表され、これらの各フィルターは実際には KsProxy です。
アプリケーションでは、システム デバイス列挙子を使用して、システム上の WDM デバイス モニカーを検索します。 KsProxy は、モニカーで BindToObject を 呼び出すことによってインスタンス化されます。 KsProxy はあらゆる種類の WDM デバイスを表すことができるため、ドライバーに対してクエリを実行して、ドライバーがサポートするプロパティ セットを特定する必要があります。 プロパティ セットは、WDM ドライバー、および MPEG-2 ソフトウェア デコーダーなどの一部のユーザー モード フィルターによって使用されるデータ構造のコレクションです。 KsProxy は、これらのプロパティ セットに対応する COM インターフェイスを公開するように自身を構成します。 KsProxy は COM メソッドの呼び出しをプロパティ セットに変換し、ドライバーに送信します。 ハードウェア ベンダーは、デバイスの特殊な機能を公開するベンダー固有のインターフェイスであるプラグインを提供することで、KsProxy を拡張できます。 これらの詳細はすべて、アプリケーションには表示されません。 アプリケーションは、他の DirectShow フィルターと同じ方法で、KsProxy を使用してデバイスを制御します。
カーネル ストリーミング
WDM デバイスでは、ユーザー モードに切り替えることなく、データがカーネル モードで完全にストリーミングされるカーネル ストリーミングがサポートされています。 カーネル モードとユーザー モードの切り替えは、計算コストがかかります。カーネル ストリーミングを使用すると、ホスト CPU に負荷をかけずに高ビット レートを実現できます。 WDM ベースのフィルターでは、カーネル ストリーミングを使用して、システムのメイン メモリにデータをコピーすることなく、同じカードまたは別のカードで、あるハードウェア デバイスから別のハードウェア デバイスにマルチメディア データを直接渡すことができます。
アプリケーションの観点からは、データが 1 つのユーザー モード フィルターから次のユーザー モード フィルターに移動したかのように表示されます。 実際には、データがユーザー モードにまったく渡されない可能性がありますが、代わりに、あるカーネル モード デバイスから別のカーネル モード デバイスに直接ストリーミングされ、ビデオ グラフィックス カードにレンダリングされる可能性があります。 ファイルへのキャプチャなどの一部のシナリオでは、ある時点でデータがカーネル モードからユーザー モードに渡される必要があります。 ただし、このスイッチでは、必ずしもデータをメモリ内の新しい場所にコピーする必要はありません。
通常、アプリケーション開発者は、バックグラウンド情報を除き、カーネル ストリーミングの詳細に関心を持つ必要はありません。 WDM、カーネル ストリーミング、KsProxy、および関連トピックの詳細については、Microsoft DDK を参照してください。
関連トピック