DirectShow GraphEdit

DirectX SDKには、GraphEditというツールが含まれています。 DirectShowがどのような構造をしていて、どのような挙動を示すかを知るには、説明を読むよりGraphEditを弄り回してみるのが最適だと私は思っているので、GraphEditの使い方を説明しながらDirectShowの説明を行いたいと思います。 (ただし、ここではDirectShowというより、DirectXの説明になっている部分があります。)

GraphEditを起動する

まず、GraphEditを起動しましょう。 私の環境では、「スタート > 全てのプログラム > Microsoft DirectX 9.0 SDK > DirectX Utilities > GraphEdit」でGraphEditを起動できます。 GraphEditを起動すると、以下のような画面が現れると思います。

GraphEditで音を出してみる

とりあえず、何かを動かしてみましょう。 まずは音からやってみようと思います。 私の手元のPCはXPなので、XPの起動時のWAVファイルをGraphEditで再生してみようと思います。 まず、GraphEditのメニューで「Graph > Insert Filters」を選びます。

すると、「Which filters do you want to insert ?」というダイアログが出現します。 そこで、「DirectShow Filters > File Source (Async)」を選びます。 次にどのファイルを開きたいか聞いてくるダイアログが出現するので、「C:\WINDOWS\Media\Windows XP Startup.wav」もしくは他のWAVファイルを選んでみてください。 ( もちろん、他のフォルダにあるWAVファイルでも構いません。 DirectX SDKをインストールすると、「C:\DXSDK\Samples\Media」フォルダにWAV、MP3、MPEGなどの各種メディアファイルのサンプルがあります。 )

次に、filter選択ダイアログから「Audio Renderers > Default DirectSound Device」を選んでください。 以上の動作により、GraphEditの画面に2つの長方形の箱が出現したと思います。 とりあえず、filter選択ダイアログはこれ以上使わないので、「Close」ボタンを押します。

「Windows XP Startup」という箱にOutputという出っ張りがあるので、それをクリックし、「Default DirectSound Device」の「Audio Input pin (renderered)」という出っ張りまでドラッグします。 すると、突然、新しい箱が現れてそれぞれつながります。

その状態で、メニューから「Graph > Play」を選択するか、再生用の矢印をクリックするとWAVファイルが再生されます。

概要説明

とりあえず、これらを動かしてみたところで、DirectShow(というよりここではDirectX)の説明をしたいと思います。

DirectShowの構造

DirectShowは、「フィルタ(Filter)」と呼ばれる部品をつなぎ合わせて「グラフ(Graph)」を作成し、Graphに対して再生や停止などの動作を行うという構造になっています。 WAVの例では、WAVファイルなどを表す箱がFilterです。 Filterをつなぎ合わせた全体がGraphです。 また、各Filterに付いている接続端子が「ピン(Pin)」です。

アプリケーションを書くために最低限必要なDirectShowの基本コンポーネントを以下に示します。

Filter
Filterは、データの入出力や変換など、もっとも基本となる動作をするコンポーネントです。 DirectShowは、様々なフィルタをつなぎ合わせることにより各種機能を実現しています。 Filterの種類は3種類あります。
  • Source Filter
  • Transform Filter
  • Renderer Filter
Source Filterは、入力を行うためのフィルタです。 全ての映像データはSource Filterから発生します。 一般的なSource Filterの例としては、キャプチャカード、ビデオデバイス、音源、ファイルなどがあります。
Transform Filterは、入力を何らかの形で変化させて出力させます。 ファイルフォーマットを理解する、フォーマット変換をする、何らかのエフェクトをかける、など、色々なものがあります。
Renderer Filterは、Source Filterからのデータストリームの終点になります。 Renderer Filterは、最終的なレンダリングを担当します。 Renderer Filterとしては、ディスプレイへの出力、音声の出力、外部デバイスへの出力、ファイルへの保存、ネットワークへの送出(RTPなど)、などを行うものがあります。
Pin
Filterには最低1つのPinがあります。 (ただし、Transform Filterは最低2つです。) Pinが複数あるFilterもあります。 Filterは、PinとPinを接続することによりそれぞれの関連を構築します。 Pinには、Output PinとInput Pinの2種類があります。 それぞれのPinは自分と異なる種類のPinとしか接続できません。 例えば、Output PinとOutput Pinを接続することはできません。 Output Pinは必ずInput Pinと接続されなくてはなりません。
Graph
DirectShowでは、Filterを組み合わせることによりGraphができます。 再生/停止/一時停止などの動作はGraphに対して行われます。 Graphには、Source FilterとRenderer Filterがそれぞれ最低1つ含まれていなければなりません。
Filter Graph Manager
Filter Graph Managerは、FilterとGraphの生成や接続などを行います。 ほとんどの基本的な動作は、Filter Graph Managerを基点として行われます。 アプリケーション作成者は、まず、Filter Graph Managerを生成することからはじめます。

自動Graph生成

DirectShowには、Graphの自動生成機能があります。 GraphEditを使ったWAVの例では、ファイルの入力(ファイル入力Filter)と出力先(音声出力Filter)の2つのフィルタを指定してつなぎ合わせると途中にいきなりTransform Filterが足されました。 DirectShowには、このようなGraphの自動生成機能(補間機能)があります。

次に、GraphEditを使って音声入りMPEGファイルの再生を行ってみましょう。 まず、GraphEditを起動してメニューの「File > Render Media File」を選び、「C:\DXSDK\Samples\Media\water.mpg」を選んでください。 すると、自動的にMPEGファイルを再生するGraphができあがります。 さらに、GraphEditの再生ボタンを押すと映像と音声が再生されます。

このように、DirectShowのGraph生成機能は、ファイルを指定するだけで再生まで行う事も可能です。

最後に

DirectX付属のGraph Editの簡単な使い方とDirectShowの概要をまとめて書いてみました。 間違っている、説明が足りない、わかりにくい、などございましたらご指摘ください。