Hello DirectShow

chakemiです。

本日はDirectShowの最初の一歩として、前回、作成したWebMファイルを再生するアプリケーションを作成してみます。

開発環境

  • WindowsXP SP3
  • VisualC++2010Express
  • WindowsSDK

フィルタグラフマネージャーのインスタンスを作成し、フィルタグラフを作成し、CoInitializeを呼び出して COM ライブラリを初期化します。

次にCoCreateInstance を呼び出してフィルタ グラフ マネージャを作成します。 IGraphBuilderインターフェイス以外に必要となる、IMediaControlインターフェースとIMediaEventインターフェースを取得します。

IGraphBuilderインターフェイスのRenderFileメソッドに再生ファイルを設定し、IMediaControlインターフェースのRunメソッドで再生を開始します。 IMediaEventのWaitForCompletionメソッドを呼び出して、再生が完了するまで待機させます。

RenderFileメソッドは、指定されたファイルを再生できるコーデックなどのフィルタグラフを自動的に作成してくれるので、たったこれだけコードでWebMファイルを再生するアプリの出来上がりです。 当然、デコーダフィルタなどがインストールされている必要がありますが。。。

以下、サンプルコード。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <dshow.h>
#include <iostream>

using namespace std;

int main(void)
{
  cout << "[Enter]キーで再生" << endl;
  getchar();

  CoInitialize(NULL);

  IGraphBuilder *pGraph;
  IMediaControl *pMediaControl;
  IMediaEvent *pEvent;

  CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
      IID_IGraphBuilder, (void **)&pGraph);
  pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
  pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

  //グラフ作成
  pGraph->RenderFile(L"C:\\test.webm", NULL);

  //グラフ実行
  pMediaControl->Run();

  //終了待ち
  long evCode;
  pEvent->WaitForCompletion(INFINITE, &evCode);

  //開放
  pMediaControl->Release();
  pEvent->Release();
  pGraph->Release();
  CoUninitialize();

  return 0;
}

※このサンプルは全く例外処理をしていないのでご注意ください。

次回は、自動的に構築されたフィルタグラフが、実際にはどのように構成されているのか、それを確認するためにROT(Running Object Table)を使用して作成されたフィルタグラフを「graphstudio.exe」でロードしてみたいと思います。

Comments