簡単な DirectShow のサンプルとしてファイルを再生するアプリケーションのプログラムについて解説する
とりあえずプログラムの実行
プロジェクトの作成
1.Visual Studio を起動させる。
2.[ファイル(F)]-[新規作成(N)]-[プロジェクト(P)] を選択
3.「テンプレート」で「Win32コンソールアプリケーション」を選択し、適当な名前でプロジェクトを作成
4.「Win32 アプリケーションウィザード」では、「空のプロジェクト(E)」にチェックを入れる
5.プロジェクトのプロパティで下記の二つの操作を行う
5-1.[構成プロパティ]-[全般]の「文字セット」で「設定なし」を選択
5-2.[構成プロパティ]-[リンカ]-[入力]の「追加の依存ファイル」に「strmiids.lib」と入力
- あらかじめ、「構成(C):」では「すべての構成」を選択しておいた方がいいかも
サンプルコードのビルド・実行
1.「ソリューションエクスプローラ」内の「ソースファイル」フォルダーアイコンを右クリック
2.[追加(D)]-[新しい項目(W)...]をクリック
3.「新しい項目の追加」ウィンドウで・・
- 「カテゴリ(C):」で[Visual C++]-[コード]を選択
- 「テンプレート(T):」で[C++ ファイル(.cpp)]を選択
- 「ファイル名(N):」に適当なファイル名を入力
4.こちらのページの「サンプルコード」からプログラムをコピー&ペーストする
5.ビルドして実行
解説
DirectShowの概要でも説明した通り、DirectShow アプリケーションの作成の主な手順は次の3つ
1.フィルタ グラフ マネージャのインスタンスを作成する
2.フィルタ グラフ マネージャを使ってフィルタ グラフを作成する
3.グラフを実行し、データをフィルタで処理する
これらの手順がコードのどの部分に対応しているか説明する
フィルタ グラフ マネージャのインスタンスを作成する
CoInitialize を呼び出して COM ライブラリを初期化する
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// エラー処理コード
}
CoCreateInstance を呼び出してフィルタ グラフ マネージャを作成する
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
- クラス識別子 (CLSID) は CLSID_FilterGraph
- フィルタ グラフ マネージャはインプロセス DLL として提供されるので、実行コンテキストは CLSCTX_INPROC_SERVER
参考:
作成したフィルタグラフマネージャ(pGraph)より、次の2つのインターフェイスを作成する
- IMediaControl
- ストリーミングを制御する
- グラフを停止および開始するメソッドが含まれている
- IMediaEvent
- フィルタ グラフ マネージャからイベントを取得するためのメソッドがある
- この例では、このインターフェイスを使って、再生が完了するまで待機する
IMediaControl *pControl;
IMediaEvent *pEvent;
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
フィルタ グラフ マネージャを使ってフィルタ グラフを作成する
hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
- IGraphBuilder::RenderFile メソッドは、指定されたファイルを再生できるフィルタ グラフを作成する
- 最初のパラメータは、ワイド文字 (2 バイト) の文字列で表されたファイル名
- 2 つ目のパラメータは予約済みで、NULL でなければならない
グラフを実行し、データをフィルタで処理する
グラフを実行するには、IMediaControl::Run メソッドを呼び出す
hr = pControl->Run();
- フィルタ グラフを実行すると、データはフィルタ内で処理され、ビデオおよびオーディオとしてレンダリングされる
- 再生は別のスレッドで続けられる
- IMediaEvent::WaitForCompletion メソッドを呼び出して、再生が完了するまで待機できる。
long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);
アプリケーションが終了したら、インターフェイスのポインタを解放し、COM ライブラリを閉じる
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
最終更新:2010年05月16日 16:13