アットウィキロゴ
ノート > DirectShow 入門 > 動画を再生するプログラムを作る

簡単な DirectShow のサンプルとしてファイルを再生するアプリケーションのプログラムについて解説する

ファイルの再生法」より概要を説明する

とりあえずプログラムの実行

プロジェクトの作成

事前に開発環境の導入のページの操作が一通り済んでいること。

1.Visual Studio を起動させる。

2.[ファイル(F)]-[新規作成(N)]-[プロジェクト(P)] を選択

3.「テンプレート」で「Win32コンソールアプリケーション」を選択し、適当な名前でプロジェクトを作成
  • 今回は「testDirectShow」とする

4.「Win32 アプリケーションウィザード」では、「空のプロジェクト(E)」にチェックを入れる

5.プロジェクトのプロパティで下記の二つの操作を行う
5-1.[構成プロパティ]-[全般]の「文字セット」で「設定なし」を選択
5-2.[構成プロパティ]-[リンカ]-[入力]の「追加の依存ファイル」に「strmiids.lib」と入力
  • あらかじめ、「構成(C):」では「すべての構成」を選択しておいた方がいいかも

サンプルコードのビルド・実行

1.「ソリューションエクスプローラ」内の「ソースファイル」フォルダーアイコンを右クリック

2.[追加(D)]-[新しい項目(W)...]をクリック

3.「新しい項目の追加」ウィンドウで・・
  • 「カテゴリ(C):」で[Visual C++]-[コード]を選択
  • 「テンプレート(T):」で[C++ ファイル(.cpp)]を選択
  • 「ファイル名(N):」に適当なファイル名を入力
    • 今回は「testplay.cpp」とした

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