プロジェクトのプレビュー
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
[この API はサポートされていないため、今後変更または使用できない可能性があります。]
プロジェクトをプレビューするには、レンダー エンジンと呼ばれるコンポーネントが必要です。これにより、タイムラインから DirectShow フィルター グラフがビルドされます。 フィルター グラフは、実際にプロジェクトをレンダリングするグラフです。 レンダリング エンジンを使用して、プロジェクトをプレビューしたり、最終的な出力ファイルを書き込んだりできます。
この記事では、レンダリング エンジンの詳細については説明しません。 プレビューの場合、必要なメソッド呼び出しはごくわずかです。 出力ファイルの書き込み方法など、より詳細な説明については、「 プロジェクトのレンダリング」を参照してください。 次のコード例は、プレビュー グラフを構築する方法を示しています。
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
hr = pRender->RenderOutputPins( );
CoCreateInstance 関数を使用して、レンダリング エンジンを作成します。 次に、レンダリング エンジンの IRenderEngine インターフェイスで次のメソッドを呼び出します。
- SetTimelineObject。 使用するタイムラインを指定します。
- ConnectFrontEnd。 タイムライン内のグループごとに 1 つの出力ピンを使用して、部分的なフィルター グラフを作成します。
- RenderOutputPins。 各出力ピンをビデオまたはオーディオ レンダラーに接続して、プレビュー グラフを完了します。
グラフが作成されたら、DirectShow フィルター グラフと同様に、グラフを実行してプロジェクトをプレビューできます。 まず、 IRenderEngine::GetFilterGraph メソッドを呼び出して、フィルター グラフへのポインターを取得します。
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
IMediaControl インターフェイスと IMediaEvent インターフェイスのフィルター グラフに対してクエリを実行します。 これら 2 つのインターフェイスを使用してグラフを実行し、再生が完了するまで待ちます。 これらのインターフェイスの使用方法の詳細については、「 ファイルを再生する方法 」と 「イベントへの応答」を参照してください。 次のコードは、これらのインターフェイスを使用する 1 つの方法を示しています。
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
long evCode;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
この例のコードは、 IMediaEvent::WaitForCompletion メソッド呼び出しの INFINITE パラメーターにより、再生が完了するまでプログラムの実行をブロックします。 ただし、再生中に問題が発生した場合は、プログラムが応答を停止する可能性があります。 実際のアプリケーションでは、メッセージ ループを使用して再生が完了するまで待機します。 また、再生を中断する方法をユーザーに提供することもお勧めします。
レンダリング エンジンの使用が完了したら、常に IRenderEngine::ScrapIt メソッドを呼び出します。 このメソッドは、フィルター グラフを削除し、レンダリング エンジンが保持するすべてのリソースを解放します。
pRender->ScrapIt();
関連トピック