非圧縮 RGB への DV のキャプチャ
この例は、カムコーダから DV をキャプチャし、プレビュー中にその DV を非圧縮 RGB としてファイルに保存する方法を示したものである。次の図に示すフィルタ グラフを使う。
DV スプリッタ フィルタは、インターリーブされたオーディオおよびビデオを別々のビデオ ストリームとオーディオ ストリームに分割する。DV エンコードのビデオはDV ビデオ デコーダ フィルタに渡され、そのフィルタによって非圧縮 RGB ビデオが出力される。RGB ビデオは、スマート ティー フィルタを通じて AVI Mux フィルタ (キャプチャ用) およびビデオ レンダラ (プレビュー用) に渡される。一方で、DV スプリッタからのオーディオ ストリームは、インフィニット ピン ティー フィルタを通じて AVI Mux およびオーディオ レンダラに渡される。フィルタ グラフ マネージャは、サンプルおよびグラフの基準クロックのタイム スタンプを使って、これらのすべてのストリームの同期をとる。
このグラフは、不必要に込み入っているように見えるかもしれないが、DV エンコードのビデオ ストリームは確実に 1 回しかデコードされず、必要な CPU を最小限に抑える。また、ビデオはスマート ティー フィルタを通過するが、その一方でオーディオはインフィニット ピン ティー フィルタを通過する点に注意すること。スマート ティーは、キャプチャのパフォーマンスを向上するためにプレビュー フレームをドロップできる。これは、ビデオにとっては望ましいが、オーディオの場合はドロップされたサンプルがきわめて顕著なので、望ましくない。また、オーディオはビデオよりも必要とされる帯域幅が狭いので、相対的にファイル内でオーディオがドロップされる可能性はほとんどない。
このグラフは一度に 1 セクションずつ作成しなければならないが、ここでも RenderStream メソッドを使える。次のコードを使う。
// グラフのファイル作成セクションを作成する。
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("C:\\Example3.avi"), &pMux, 0);
// MSDV から DV splitter へ。
IBaseFilter *pDVSplit; // DV スプリッタ (CLSID_DVSplitter) を作成する。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);
// スプリッタから DV デコーダを経てスマート ティーへ。
IBaseFilter *pDVDec; // DV デコーダ (CLSID_DVVideoCodec) を作成する。
IBaseFilter *pSmartTee; // スマート ティー (CLSID_SmartTee) を作成する。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
pSmartTee);
// スマート ティー (ビデオ) から Avi Mux へ。
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);
// スマート ティーからプレビューへ。
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);
// DV スプリッタ (オーディオ) からインフィニット ティーを経て Avi Mux へ。
IBaseFilter *pTee; // インフィニット ピン ティー (CLSID_InfTee) を作成する。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);
// インフィニット ピン ティーからプレビューへ。
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
DV スプリッタ、DV ビデオ デコーダ、スマート ティー、インフィニット ピン ティーの各フィルタを作成し、各フィルタをフィルタ グラフに追加する必要がある。簡潔にするため、前のコードではこれらの手順は省略した。この例では、ICaptureGraphBuilder2::FindPin メソッドを使って、スマート ティー フィルタのキャプチャ ピンおよびプレビュー ピンを検索する。キャプチャは常に出力ピン 0 で、プレビューは出力ピン 1 である。