Type-1 ファイルからの送信
ファイルのプレビュー中に type-1 ファイルを送信するには、次の図に示すフィルタ グラフを使う。
このグラフに含まれるフィルタは次のとおりである。
- AVI スプリッタ は、AVI ファイルを解析する。type-1 DV ファイルの場合、出力ピンはインターリーブされた DV サンプルを出力する。
- インフィニット ピン ティー フィルタは、インターリーブされた DV を送信ストリームとプレビュー ストリームに分割する。両方のストリームにインターリーブされた同じデータが含まれる。このグラフはスマート ティーではなく、インフィニット ピン ティーを使う。なぜなら、ファイルからの読み取りの際に、ライブ キャプチャにあるようなフレームをドロップする危険性がないからである。
- DV スプリッタは、インターリーブされたストリームを DV ビデオ デコーダがデコードする DV ビデオ ストリームとオーディオ ストリームに分割する。ストリームは両方とも、プレビュー用にレンダリングされる。
次のように、グラフを作成する。
ICaptureGraphBuilder2 *pBuilder; // キャプチャ グラフ ビルダ。
IBaseFilter *pDV; // DV キャプチャ フィルタ (MSDV)。
// pDV を初期化する (省略)。
// Capture Graph Builder を作成し、初期化する (省略)。
// インフィニット ピン ティー フィルタをグラフに追加する。
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");
// ファイル ソース フィルタをグラフに追加する。
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
L"C:\\YourFileNameHere.avi",
L"Source",
&pFileSource);
// AVI スプリッタ フィルタをグラフに追加する。
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");
// ファイル ソースを AVI スプリッタに追加する。
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
// AVI ファイルではない。
}
//インフィニット ピン ティー フィルタにファイル ソースを接続する。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
// type-1 DV ファイルではない。
}
// 送信のため、インフィニット ピン ティーから MSDV に 1 つのストリームを
// レンダリングする。
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
// プレビューのため、インフィニット ピン ティーからもう 1 つのストリームを
// レンダリングする。
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
- IGraphBuilder::AddSourceFilter を呼び出して、ソース フィルタをフィルタ グラフに追加する。
- AVI スプリッタとインフィニット ピン ティーを作成して、グラフに追加する。
- ICaptureGraphBuilder2::RenderStream を呼び出して、ソース フィルタを AVI スプリッタに接続する。MEDIATYPE_Interleaved を指定することによって、ソース ファイルが type-1 DV ファイルでなければ、メソッドが必ず失敗するようにする。失敗したら、戻って、代わりに type-2 転送グラフを作成するように試みればよい。
- 再度 RenderStream を呼び出して、インターリーブされたストリームを AVI スプリッタからインフィニット ピン ティーに送る。
- 3 回目の RenderStream の呼び出しで、デバイスに送信するために、あるストリームをインフィニット ピン ティーから MSDV フィルタに送る。
- 最後にもう 1 回 RenderStream を呼び出して、グラフのプレビュー セクションを作成する。
プレビューが必要ない場合は、次のようにただファイル ソースを MSDV フィルタに接続する。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);