次の方法で共有


Type-1 ファイルからの送信

ファイルのプレビュー中に 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);
  1. IGraphBuilder::AddSourceFilter を呼び出して、ソース フィルタをフィルタ グラフに追加する。
  2. AVI スプリッタとインフィニット ピン ティーを作成して、グラフに追加する。
  3. ICaptureGraphBuilder2::RenderStream を呼び出して、ソース フィルタを AVI スプリッタに接続する。MEDIATYPE_Interleaved を指定することによって、ソース ファイルが type-1 DV ファイルでなければ、メソッドが必ず失敗するようにする。失敗したら、戻って、代わりに type-2 転送グラフを作成するように試みればよい。
  4. 再度 RenderStream を呼び出して、インターリーブされたストリームを AVI スプリッタからインフィニット ピン ティーに送る。
  5. 3 回目の RenderStream の呼び出しで、デバイスに送信するために、あるストリームをインフィニット ピン ティーから MSDV フィルタに送る。
  6. 最後にもう 1 回 RenderStream を呼び出して、グラフのプレビュー セクションを作成する。

プレビューが必要ない場合は、次のようにただファイル ソースを MSDV フィルタに接続する。

hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);