ホーム < ゲームつくろー! < DirectX技術編 < DirectShowの根っこ(基礎編)


その3 DirectShowの根っこ(基礎編)


 DirectShowはマルチメディアを統合的に扱うことが出来る巨大なコンポーネントの1つです。これを自由に駆使できれば、きっと飯を食っていけます(笑)。逆に言えば、それだけ難解な技術が凝縮しているとも言えます。ゲームでDirectShowを使う時には、その機能のごく一部を借りるだけなので、扱いは比較的簡単になります。注目点は、Direct3Dオブジェクトに動画を高速に描画できるという能力です。一度この機構を確立してしまえば、もう何でもありの世界が待っています。

 期待感抜群であるこのコンポーネントは、一方で適当に扱うとまともに動いてくれない難物でもあります。こういう物は、面倒でも基礎からみっちりと学ぶ方が近道なのですが、いかんせんDirectShowの文献は非常に少なくて、どう学んで良いかもよくわからないのが現状です。そこで、この章では基礎を学ぶと言う観点から、DirectShowの根っこをざっくり紹介します。

 尚、この章や以降の章は「PROGRAMING MICROSOFT DIRECTSHOW FOR DIGITAL VIDEO AND TELEVISION」を大いに参考にしております。英語の本ですが、割と読みやすいのでお勧めです。この手の本にしてはお値段もお手ごろのU.S.A. $49.99です。



@ フィルタとフィルタグラフとピン

 DirectShowを扱うにあたり「フィルタ(Filter)」と「フィルタグラフ(Filter Fraph)」と「ピン(Pin)」は絶対に、絶対に知らなければならない用語です。また、「ストリーム(Stream)」という用語も重要です。まずは、この辺りから攻めていきましょう。

 「フィルタ」と言うのはデータ変換器の事です。入力されたデータ(=信号、ストリーム)を内部でごにょごにょと変換して、出力します。入力端子と出力端子のついた「箱」のイメージがあれば十分です。エレキギターの経験がある人ならばエフェクターを思い浮かべていただければ、ほぼフィルタのイメージに近いと思います。


フィルタのイメージ


 フィルタについた入力端子と出力端子、これをDirectShowでは「ピン」と呼んでいます。フィルタの種類によってピンの数は様々ですが、必ず入出力のどちらか、もしくは両方のピンが刺さっています。フィルタはデフォルトでDirectShow(ハードウェア)にたくさん用意されていますが、ユーザはフィルタの中身でデータがどうやって変換されているのかなどを気にする必要は一切ありません。また扱うファイルのフォーマットを知る必要もありません。フィルタは入力されてきたデータをちゃんと判断して、適切な出力をしてくれます。よって、プログラマは自分がしたいことを実現するようにフィルタをつなげる事だけに集中できるわけです。

 フィルタは小さな仕事を行う箱ですが、それがピンによって繋がると、一連の動作を行うシステムになります。そのシステムで使われるフィルタの束とピン同士の接続をまとめて「フィルタグラフ」と呼んでいます。フィルタグラフに登録されたフィルタがお互いに繋がり、一連の流れを形成して動画の出力などの目的を達成するわけです。フィルタグラフでは完全なデータの流れを定義しなければならないため、例えば状況によって流れを変えるということは出来ません。ただし、フィルタグラフは複数定義することができます。ですから、フィルタグラフAとフィルタグラフBを状況によって切り替えるというのは十分可能です。一度固まったフィルタグラフ内では、多量のデータがいっせいに流れます。その流れを管理して同期を取るのもフィルタグラフの仕事です。


フィルタグラフのイメージ


 ファイル内やカメラからのデータが様々な変換を経て最終的に画面やファイルに出力される、この流れを「ストリーム」と呼んでいます。ただ、ストリームと言うのはデータの一塊の意味で使われることもあるようなので、「すいすいと流れるデータの塊」という漠然としたイメージで良いかもしれません。


A フィルタの種類

 フィルタは大まかに3種類に分けられます。これをしっかり認識するのが、DirectShowを理解するために重要になります。3種類とは「Source Filter」「Transform Filter」そして「Renderer Filter」です。

 Source Filterは動画や音声のソースと直接接続する入力専用フィルタです。例えばハードディスクに入っているAVIファイルなどは、最初にSource Filterに取り込まれます。Souce Filterはその性質からフィルタグラフの一番上流に位置することになります。フィルタを正しく選べば、ハードディスク内の動画だろが、ウェブカメラだろうがデジタルビデオだろうが、Windowsが扱えるのであればほぼ何でも入力できます。特にカメラ系のライブ情報を入力するSource FilterをCapture Source Filterと呼んでいます。

 Transform Filterは入力されてきたストリームを様々なフォーマットに変換する専門家です。例えば、WAVをMP3に変換するフィルタや、AVIをMPEGに変換するフィルタなどは、すべてTransform Filterとしてまとめられます。昔、プログラマはメディアファイルのフォーマットを完全に理解して、その変換を行おうと努力したのものですが、DirectShowでは変換フィルタが用意されているので、その作業がごっそりといらなくなります。恐ろしいほど便利です。
 Transform Filterの凄い点はまだあります。このフィルタは複数の入力を受け付けて、そして複数の出力ピンにそれを出力することが出来るのです。また、複数の入力を1にまとめて1つの出力から送出することもできます。前者は動画ファイルから動画と音声を分離する時などに使用しますし、後者は複数の動画を重ね合わせて1つの動画として出力する時などに大活躍します。やはりあまりの機能に武者震いが来ます(^-^)

 Renderer FilterはTransform Filterによって変換されたデータを出力する専門家です。このフィルタが無いと、せっかく変換したデータも目に見える形で現れなくなってしまいます。出力と言うと画面への出力を思い浮かべますが、それだけではありません。ファイルとしてハードディスクに出力するのも、音だけをスピーカーに出力するのもすべて出力として扱われます。1つのフィルタグラフの中には目的に合わせたRenderer Filterが1つ以上存在します。例えば、動画を再生しながらAVIをMPEGに変換する時は少なくとも3つのRender Filterが活躍していることになります(映像出力、音声出力、ファイル出力)。もっとも、ゲームに限って言えば、画面に出すだけで十分なのでこのようなマルチレンダリングはあまり使いません。


フィルタタイプのイメージ



B フィルタの接続

 フィルタは何でもかんでもつなげられると言うわけではありません。例えば、WAVを扱うソースフィルタを直接MPEG2に変換するフィルタはデフォルトでは無い方が普通です(フィルタを作ればできますが)。フィルタグラフがちゃんと動くようにするために、出力ピンと入力ピンが接続可能であるかどうか、ユーザはちゃんとテストしないといけません。DirectShowではフィルタを接続する時にテストができます。もし接続できないピンであればフィル同士の接続は失敗してしまいます。逆に言えば、接続に成功したフィルタはデータを通すことが出来ることが保証されるわけです。こうなると、色々試したくなってきますよね。

 接続テストについて少し細かく掘り下げると、まず各フィルタは自分が扱うことの出来るメディアの種類をリストとして公開します。また、自分がどういう転送方法を扱えるのかという情報も公開します。フィルタグラフは2つのフィルタに対して扱えるメディアの種類から、そのフィルタ同士が接続できるかどうかを判断します。次にピンは2つのフィルタのデータの転送方法が合致するかを判断します。フィルタとピンの合意が取れれば、ピンは「アロケータ」というものを生成します。これはフィルタの出力ピンが入力ピンに向けて生成するストリームもしくはバッファを管理する仲介オブジェクトです。これが出来上がった段階で、2つのフィルタはめでたく接続されることとなります。ユーザはこのテストを接続の数だけ繰り返す必要があります。

 フィルタの接続は上記のようにテストが必要で、ちょっとやっかいでもあるのですが、DirectShowにはそんなわずらわしさを解消するすばらしい機能が用意されています。Intelligent Connectという機能で、なんとユーザが接続したい2つのフィルタが直接接続できないときに、仲介するフィルタを自動的にフィルタグラフに追加して接続を可能にしてしまうのです。ですから、相当に無理な接続でない限り、DirectShowはどんな接続をも成功させてしまう可能性があります。ホント、恐ろしいです(笑)。Intelligent Connectは接続が成功するようにDirectShowに用意されたフィルタを片っ端から試すので、これで接続が出来ない場合は、人が駆使しても多分だめなんだと認識するしかありません。



C フィルタグラフの役目

 フィルタグラフは、フィルタの接続を管理していますが、役目はそれだけではありません。例えば、動画を映像と音声として出力するときに、同期がとれていなければ、口と声が合わなくなってしまいます。フィルタグラフのもう1つの役目はこの「同期」で、run、stop、pauseなどの命令によってストリーム全体の流れを管理します。プログラマが触れることは、この実行停止命令と同期のタイマーを上げ下げして再生スピードをコントロールするくらいです。
 run命令が下ると、フィルタグラフ内のフィルタ全部にそのメッセージが届き、ストリームはいっせいに流れ始めます。pauseを命令すると、その流れは一時的に止まります。もう一度run命令を出すと、再び流れ始めます。stopをかけると、ストリームはきれいさっぱり破棄されます。この状態でrun命令を出すと、ストリームは最初から流れることになります。



 どうでしょう。DirectShowの魅力が見えてきたのではないでしょうか。この章で示したイメージがしっかり出来れば、後は色々試してみることでこの難物を自由に扱うことができるようになってきます。しかし、千里の道も一歩から。私たちは、まず簡単な事からこつこつと技術を積み重ねて、レベルを高めていきましょう。



参照:PROGRAMING MICROSOFT DIRECTSHOW FOR DIGITAL VIDEO AND TELEVISION 1章