GraphEdit の使い方 (1) - GraphEdit は Windows SDK に同梱されています。アプリのグラフを GraphEdit で確認しよう。

 

こんにちは、はらだんです。DirectShow アプリケーションの開発において必須のツール、GraphEdit の活用方法について 2 回に分けてご紹介します。GraphEdit は開発したフィルタのテスト、グラフの確認、デバッグ、接続されている MediaType や Format 情報を確認などができシンプルですが強力なツールです。1 回目はこのツールの使い方を紹介します。

 

目次

 

はじめに:SDK と日本語ドキュメント

 

1. GraphEdit の使い方

 -1. 起動

 -2. グラフの作成

   a. コンテンツに合ったグラフを自動生成する

   b. フィルタを選択してグラフを作成する

 -3. グラフの再生

 -4. グラフの保存

 

2. アプリケーション(他のプロセス)のグラフの確認

 -1. アプリケーション側の準備

 -2. アプリケーションのグラフの読み込み

 

 

はじめに:SDK と日本語ドキュメント

GraphEdit は Windows SDK に同梱されています。これまでに DirectX アプリケーションを開発されている方はご存知かと思いますが、以前は DirectX SDK に含まれていました。その後 Platform SDK に移り現在に至ります。プログラムは Windows SDK の以下のフォルダにあります。

 

%WindowsSdkDir%\bin\graphedt.exe

 

※Windows SDK for Windows server 2008 を標準インストールした場合以下になります。

C:\Program Files\Microsoft SDKs\Windows\6.1\bin\graphedt.exe

 

GraphEdit の使い方について、Windows SDK のドキュメントを見ますと、残念なことに英語で書かれていますが、日本語のドキュメントは実は古い DirectX SDK の中にあります。

DirectShow は DirectX9 以降大きな変更はありません。そして、DirectX9 の頃に翻訳された SDK のドキュメントに DirectShow が含まれていますので、これを参考にすることができます。

(その他 SDK の日本語ドキュメントに関してのまとめはこちらをご覧ください。)

 

1. GraphEdit の使い方

ここでは GraphEdit の使い方を紹介します。合わせて MSDN の日本語ドキュメントもご参照ください。

 

-1. 起動

GraphEdit は Windows SDK に同梱されています。Windows SDK for Windows Server 2008 の場合以下のフォルダにあります。

 

C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\graphedt.exe

 

 

 

-2. グラフの作成

グラフの作成方法は GraphEdit に自動生成させる方法と、任意のフィルタを手動で繋いでいく方法とがあります。以下にその両方を説明します。

 

a. コンテンツに合ったグラフを自動生成する

グラフの自動生成を行う作業は GraphEdit のウィンドウにコンテンツをドロップするだけです。実際に Windows SDK の以下のフォルダにあるサンプルビデオを再生するためのグラフを自動生成させてみます。

 

C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\WMP_11\media

 

フォルダ内にある Seattle.wmv を GraphEdit のウィンドウにドラッグ&ドロップします。以下の図のようなグラフができるはずです。

 

グラフを説明しますと、いちばん左「seattle.wmv」と書かれたボックスがソース フィルタを表しています。このソース フィルタには DirectShow フィルタの [WM ASF Reader] が使用されています。このフィルタはファイルからオーディオとビデオの切り出し( Split )も行いながら後続のフィルタにデータを渡します。

 

その右側にある 2 つの緑色のボックスはそれぞれデコーダ フィルタと呼ばれ、圧縮されているデータを展開し、後続に続くフィルタで扱えるようにします。今回はオーディオは WMSpeech 形式のデコード、Video は WMVideo 形式のデコードを行うフィルタが使用されています。

 

この 2 つのフィルタは DMO (DirectX Media Object) フィルタで(ボックスが緑色なのはこのことを示しています)、実は DirectShow とは別のテクノロジにより実装されたフィルタです。直接 DirectShow のグラフには読み込めませんが、Wrapper フィルタを通すことで DirectShow フィルタとして動作しています。

 

デコードされたデータはレンダラ フィルタにそれぞれ送られます。オーディオは [Default DirectSound Device] フィルタで、コントロールパネルのオーディオ デバイスの設定で規定のデバイスとして指定されているデバイスから音を出力します。ビデオは [Video Renderer] へ送られます。この [Video Renderer] はわかりにくいのですが Video Mixing Renderer 7 (VMR7) が使用されています。

 

 

 

 

b. フィルタを選択してグラフを作成する

手動でフィルタ グラフを作成する場合には 2 つのステップが必要となります。1 つ目は必要なフィルタをフィルタ一覧から追加すること。2 つ目はフィルタ間のピン接続を行うことです。

もちろん接続の際に必ずしも必要なフィルタが分かっているとは限りません。ここでは先ほど 1-2a. で扱った seattle.wmv を例に、オーディオのデコーダにどれを使えばよいのか不明であると仮定し、ビデオレンダラには Video Mixing Renderer 9 (VMR9) を使うグラフを作成してみます。以下はそのステップです。

 1) フィルタの追加

  メイン メニューより [Graph] - [Insert Filters..] を選択します。

  フィルタ一覧のダイアログが表示されますので、そこから必要な

  フィルタを選択して[Insert Filter] ボタンを押します。

 

  a) ソースフィルタの WM ASF Reader フィルタを追加します。

    [DirectShow Filters] の中から [WM ASF Reader] フィルタを選択し、

    [Insert Filter] ボタンを押します。ファイルを指定するダイアログが

    表示されますので seattle.wmv を指定します。

 

  b) ビデオデコーダフィルタの WMVideo Decoder DMO フィルタを追加します。

    [DirectShow Filters] の中から [WMVideo Decoder DMO] フィルタを

    選択し、[Insert Filter] ボタンを押します。

 

  c) レンダラフィルタの Video Mixing Renderer 9 フィルタを追加します。

    [DirectShow Filters] の中から [Video Mixing Renderer 9] フィルタを

    選択し、[Insert Filter] ボタンを押します。

 

  d) オーディオレンダラフィルタの Default DirectSound Device を選択します。

    [Audio Renderers] の中から [Default DirectSound Device] フィルタを

    選択し、[Insert Filter] ボタンを押します。

 

  e) フィルタ一覧のダイアログを閉じます。

 

     

 

 2) フィルタ間のピン接続

  フィルタを表すボックスの右側に小さな四角があります。これが出力ピンを

  表しています。同様にボックスの左側にある小さい四角が入力ピンを

  表しています。出力ピンから後続のフィルタの入力ピンにドラッグして

    ピン接続を行います。

 

  a) ソース フィルタとオーディオ レンダラ フィルタをピン接続する。

    [seattle.wmv] とかかれたソース フィルタを表すボックスの右側に小さな

    四角が 2 つ表示されていると思います。オーディオは上のほうにある

     [Raw Audio 0] と書かれた方の出力ピンから出力されます。

    ここからマウスのドラッグを始めると矢印が表示されます。

    そのままマウスを [Default Direct Sound Device] のボックスの左側にある

    小さい四角まで移動してください。デコーダである

     [WMSpeech Decoder DMO] フィルタが自動的に追加され、

    ソース フィルタからオーディオ レンダラ フィルタまでが接続されました。

 

  b) ソース フィルタとビデオデコーダフィルタをピン接続します。

 

  c) ビデオデコーダフィルタとレンダラフィルタ (VMR9) をピン接続します。

 

  最終的に以下のような接続状態のグラフが作成されたでしょうか?

 

 

 

-3. グラフの再生

グラフが完成しました。再生を行ってみましょう。メイン メニューから [Graph] - [Play] を選択、もしくは再生ボタンを押してください。新しくウィンドウが開き動画が再生されます。

 

 

 

 

-4. グラフの保存

作成したグラフはメイン  メニューの [File] - [Save Graph (.GRF)] を選択して保存することができます。保存したグラフは GraphEdit 上で再度同じグラフを使うときにも使用できますし、プログラムからこのグラフを読み込み再生することもできます。

保存した GRF ファイルをプログラムから読み込みグラフを使用する方法は MSDN のページにてサンプルコード付きで紹介されています。

 

 プログラムによる GraphEdit ファイルのロード

 

 

 

2. アプリケーション(他のプロセス)のグラフの確認

DirectShow アプリケーションのデバッグのため、アプリケーション(他のプロセス)のフィルタ グラフを GraphEdit で読み込むことができます。アプリケーション側ではこれに対応するための処理をあらかじめ実行しておく必要があります。

 

-1. アプリケーション側の準備

アプリケーション上でフィルタ グラフのインスタンスを実行中 オブジェクト テーブル (ROT) に登録します。このサンプルプログラムが以下の MSDN のページで紹介されています。

 

 外部プロセスからのグラフのロード

 

ここで紹介されている AddToRot() 関数と RemoveFromRot() 関数をそのままアプリケーションにコピーして、フィルタ グラフ マネージャの生成直後に AddToRot() 関数を呼び出し、グラフの破棄の直前に RemoveToRot() を呼び出すようにします。

 

 

-2. アプリケーションのグラフの読み込み

ROT への登録の処理を行っているアプリケーションの実行中に GraphEdit でメインメニューの [File] - [Connect to Remote Graph...] を選択すると ROT に登録されているインスタンスの一覧が表示されますので、1 つを選択するとアプリケーションで作成しているフィルタグラフが表示されます。

 

 

 

 

お疲れ様でした。次回以降ではグラフの MediaSubType の確認方法、プログラムを書かないで GraphEdit でファイルのコンバート、デバッグシナリオの紹介をしていきたいと思います。

 

 

2009/03/25 改行がおかしかったの修正