Type-1 ファイルからの送信
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ファイルのプレビュー中に type-1 ファイルを送信するには、次の図に示すフィルター グラフを使用します。
このグラフのフィルターは次のとおりです。
- AVI スプリッターは AVI ファイルを解析します。 タイプ 1 DV ファイルの場合、出力ピンはインターリーブ DV サンプルを提供します。
- Infinite Pin Tee フィルターは、インターリーブされた DV を送信ストリームとプレビュー ストリームに分割します。 両方のストリームに同じインターリーブ データが含まれています。 (このグラフでは、ライブ キャプチャと同様に、ファイルから読み取るときにフレームをドロップする危険性がないため、 スマート ティーの代わりに無限ピン ティーを使用します)。
- DV スプリッターは、インターリーブされたストリームを DV ビデオ ストリームに分割します。これは、DV ビデオ デコーダーによってデコードされ、オーディオ ストリームです。 どちらのストリームもプレビュー用にレンダラーされます。
次のようにこのグラフを作成します。
ICaptureGraphBuilder2 *pBuilder; // Capture graph builder.
IBaseFilter *pDV; // DV capture filter (MSDV)
// Initialize pDV (not shown).
// Create and initialize the Capture Graph Builder (not shown).
// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");
// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
L"C:\\YourFileNameHere.avi",
L"Source",
&pFileSource);
// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");
// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
// This is not an AVI file.
}
// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
// This is not a type-1 DV file.
}
// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
- IGraphBuilder::AddSourceFilter を呼び出して、フィルター グラフにソース フィルターを追加します。
- AVI スプリッターと無限ピン ティーを作成し、グラフに追加します。
- ICaptureGraphBuilder2::RenderStream を呼び出して、ソース フィルターを AVI スプリッターに接続します。 MEDIATYPE_Interleavedを指定して、ソース ファイルが type-1 DV ファイルでない場合にメソッドが失敗することを確認します。 その場合は、バックアウトして、代わりに type-2 送信グラフを作成できます。
- 再び RenderStream を呼び出して、AVI スプリッターから無限ピン ティーにインターリーブ ストリームをルーティングします
- RenderStream を 3 回目に呼び出して、1 つのストリームを Infinite Pin Tee から MSDV フィルターにルーティングして、デバイスに送信します。
- 最後に RenderStream を呼び出して、グラフのプレビュー セクションを作成します。
プレビューが不要な場合は、ファイル ソースを MSDV フィルターに接続するだけです。
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);
関連トピック