DV を非圧縮 RGB にキャプチャする
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
この例では、ビデオ カメラから DV をキャプチャし、プレビュー中に非圧縮 RGB としてファイルに保存する方法を示します。 次の図に示すフィルター グラフを使用します。
DV スプリッター フィルターは、インターリーブされたオーディオ/ビデオを個別のビデオストリームとオーディオ ストリームに分割します。DV でエンコードされたビデオは、非圧縮 RGB ビデオを出力する DV ビデオ デコーダー フィルターに移動します。 RGB ビデオは、Smart Tee フィルターを介して AVI Mux フィルター (キャプチャ用) とビデオ レンダラー (プレビュー用) にルーティングされます。 一方、DV スプリッターからのオーディオ ストリームは、無限ピン ティー フィルターを経由して AVI Mux とオーディオ レンダラーに送信されます。 フィルター グラフ マネージャーでは、サンプルのタイム スタンプとグラフ参照クロックを使用して、これらのストリームがすべて同期されます。
このグラフは不必要に複雑に見えるかもしれませんが、DV でエンコードされたビデオ ストリームが 1 回だけデコードされるため、CPU 要件が最小限に抑えられます。 また、ビデオはスマートティーフィルタを通過し、オーディオは無限ピンティーフィルタを通過します。 Smart Tee はプレビュー フレームをドロップしてキャプチャ パフォーマンスを向上させることができます。これはビデオには望ましいが、オーディオには適していません。ドロップされたサンプルは非常に目立ちます。 また、オーディオはビデオよりもはるかに低い帯域幅を必要とするため、ファイルにオーディオをドロップする可能性は比較的低くなります。
このグラフは一度に 1 セクションずつ作成する必要がありますが、RenderStream メソッドは引き続き役立ちます。 次のコードを使用します。
// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("C:\\Example3.avi"), &pMux, 0);
// MSDV to DV splitter.
IBaseFilter *pDVSplit; // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);
// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
pSmartTee);
// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);
// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);
// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);
// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
DV スプリッター、DV ビデオ デコーダー、スマート ティー、および無限ピン ティー フィルターを作成し、それぞれをフィルター グラフに追加する必要があります。 (簡潔にするために、これらの手順は前のコードから省略されています)。この例では、 ICaptureGraphBuilder2::FindPin メソッドを使用して、Smart Tee フィルターのキャプチャ ピンとプレビュー ピンを検索します。キャプチャは常に出力ピン 0、プレビューは出力ピン 1 です。
関連トピック