DirectShow のビデオ キャプチャ フィルタ
DirectShow のキャプチャ フィルタは、他の種類のフィルタとは異なる機能を備えている。Capture Graph Builder により、詳細部分の多くは表に現れないが、このトピックを読むと、DirectShow のキャプチャ グラフの概要を理解するために役立つ。
ピン カテゴリ
キャプチャ フィルタには、同じ種類のデータを送信する複数の出力ピンがあることが多い。たとえば、プレビュー ピンとキャプチャ ピンである。したがって、ピンを区別する方法にメディア タイプは適していない。その代わり、ピンは機能によって区別される。ピンの機能は "ピン カテゴリ" と呼ばれ、GUID を使って識別する。
ピンのカテゴリを問い合わせる方法の詳細については、「ピン カテゴリの操作」を参照すること。しかし、ほとんどのアプリケーションでは、ピンを直接問い合わせる必要はない。代わりに、さまざまな ICaptureGraphBuilder2 メソッドが、操作対象のピン カテゴリを示すパラメータを取る。Capture Graph Builder は自動的に正しいピンを検索する。
プレビュー ピンとキャプチャ ピン
一部のビデオ キャプチャ デバイスでは、プレビューとキャプチャに異なる出力ピンを使う。プレビュー ピンは画面にビデオを表示するときに使い、キャプチャ ピンはファイルにビデオを書き込むときに使う。
プレビュー ピンとキャプチャ ピンには次のような違いがある。
- キャプチャ ピンのスループットを維持するため、プレビュー ピンでは必要に応じてフレームをドロップする。
- キャプチャ ピンからの各フレームには、フレームをキャプチャしたストリーム タイムのタイム スタンプが付く。プレビュー ピンは、送信するサンプルにタイム スタンプを付けない。
プレビュー フレームにタイム スタンプがないのは、フィルタ グラフによりストリームに短い遅延時間が発生するためである。キャプチャ時間をプレゼンテーション時間として使うと、ビデオ レンダラはすべてのサンプルを少し遅れて処理することになる。そのため、ビデオ レンダラは追いつこうとしてフレームをドロップすることがある。タイム スタンプを削除すると、レンダラは各サンプルを受け取ったときにフレームをドロップせずにそのまま表示する。
プレビュー ピンのピン カテゴリは PIN_CATEGORY_PREVIEW である。キャプチャ ピンのカテゴリは PIN_CATEGORY_CAPTURE である。
ビデオ ポート ピン
ビデオ ポートはビデオ デバイス (アナログ TV チューナーなど) とビデオ カード間のハードウェア接続である。デバイスはビデオ ポートを使ってビデオ データを直接グラフィック カードに送信できる。ビデオはハードウェア オーバーレイを使って画面に表示される。ビデオ ポートは、異なるカード上にある 2 つのデバイスを接続する実際のケーブルであるか、同じカード上に配線された接続である。
ビデオ ポートの利点は、CPU による作業なしにビデオがビデオ メモリに直接入ることである。しかし、ビデオ ポートには次のような欠点がある。
- ビデオをプレビューするかどうかに関係なく、ビデオ ポートはキャプチャ中に常にオーバーレイ サーフェイスを使う。
- フレーム間のフリップは自動的に発生する。そのため、フリップを他のビデオ操作と同期させることは難しい。
キャプチャ デバイスがビデオ ポートを使う場合、キャプチャ フィルタはプレビュー ピンの代わりにビデオ ポート ピンを持つ。ビデオ ポート ピンのピン カテゴリは PIN_CATEGORY_VIDEOPORT である。
各キャプチャ フィルタには、キャプチャ ピンが少なくとも 1 つある。また、プレビュー ピンとビデオ ポート ピンのどちらかが付いていることもあるが、同時に両方が付くことはない。キャプチャ ピンとプレビュー ピンは、それぞれ異なるメディア タイプを渡すために複数使用できる。したがって、1 つのフィルタにはビデオ キャプチャ ピン、ビデオ プレビュー ピン、オーディオ キャプチャ ピン、およびオーディオ プレビュー ピンを 1 つずつ付けられる。 (ただし、オーディオではビデオ ポートに相当するものは存在しない。)
アップストリーム WDM フィルタ
Windows Driver Model (WDM) デバイスは、キャプチャ フィルタからアップストリーム方向に追加フィルタを必要とすることがある。その中には次のようなフィルタがある。
- TV チューナー フィルタ。アナログ TV チューナーのチューニングを制御する。
- TV オーディオ フィルタ。アナログ TV チューナーのオーディオ設定を制御する。
- アナログ ビデオ クロスバー フィルタ。ハードウェア デバイスを介してビデオ信号とオーディオ信号をルーティングする。たとえば、デバイスは、S ビデオ、コンポジット ビデオなど、複数の入力を持つことがある。クロスバー フィルタを使うと、アプリケーションは入力を選択できる。
これらのフィルタは DirectShow では異なるフィルタだが、通常は同じハードウェア デバイスを表す。各フィルタはデバイスの異なる機能を制御する。フィルタはピンによって接続されるが、メディア データはピン接続を通して移動しない。したがって、メディア タイプを設定してもこれらのフィルタ上のピンは接続されない。代わりに、"メディア" という GUID 値を使う。メディア GUID は特定のデバイス ミニドライバに対して一意に定義される。たとえば、同じ TV カード用の TV チューナー フィルタとビデオ キャプチャ フィルタは同じメディアをサポートする。アプリケーションはそのメディアを使って正しくグラフを作成できる。
実際には、ICaptureGraphBuilder2 を使ってキャプチャ グラフを作成する限り、これらのフィルタはグラフに自動的に追加される。詳細については、「WDM クラス ドライバ フィルタ」を参照すること。