tst | ゲームプログラマ志望が福岡で叫ぶ 『絶望』

ゲームプログラマ志望が福岡で叫ぶ 『絶望』

プログラマーになりたい!!!!! あ、風のうわさで聞いた最近若者で流行っているトゥイッターなるものを始めてみました (・ト・) @toshi_desu_yo



【DirectShowについて】



【 DirectShowシステムの概要】

マルチメディア を扱う場合以下の課題がある。
※マルチメディア : 画像や動画や音声など様々な形態の情報を統合して扱うこと。
             単に統合するだけではなく、インタラクティブ性を持たないと呼ばない場合もある

● 非常に高速に処理しなければならない大量のデータ。
● オーディオとビデオを同期し、同時に再生および終了、同じレート(割合)で再生されるようにする必要がある。
● データは ローカルファイル、ネット、TVチューナー、ビデオカメラなど様々なところに存在する。
●データのフォーマットは AVI, MPEG, 等様々である。
●プログラマは使用者がどのシステムでどのハードウェアで使用しているか知らない。



【DirectShowソリューション(商品)】

DirectShowは
データの流れやハードウェアの違い、同期の問題を開発者が気にならない設計になっています。

DirectShowではビデオ、およびオーディオの再生を高速化するため、DirectDraw, DirectSoundを使用しています。
これらはデバイスのサウンドカードやグラフィックカードを効率的にするので高速です。

様々なフォーマットや環境に対応するために DirectShow は "フィルタ" と呼ばれる複数の部品を組み合わせて使用します。

↓の図はアプリケーション、DirectShowコンポーネント、DirectShowがサポートするハードウェアコンポーネントおよびソフトウェアコンポーネントの関係を示している。


再生するファイルがデスクトップにあったり、TVチューナーだったりインターネット上にある可能性がある。
そしてフォーマットも AVI , MPEG 等様々。圧縮ファイルもある。
PCにサウンドカードがあったりなかったり。

この複雑な関係から開発者を隔離して、気にせずに使用できるようにするものが DirectShow。


=======【 フィルタグラフとそのコンポーネント 】======

DirectShowでフィルタを独自開発するための概要を示す。


【 DirectShowフィルタについて 】

第一回目で書いた通り、DirectShowはフィルタと呼ばれる各機能を持ったコンポーネントをつなぎ合わせることによって実現している。
フィルタはCOMオブジェクト。

DirectShowはあらかじめ標準のフィルタを幾つも提供しています。
拡張したい場合は、独自のカスタムフィルタを作成することもできます。

例で AVI ビデオファイルを再生するために必要な手順、それを実行するフィルタを示してみます。

①ファイルからデータを読み込む ( ソースフィルタ )
②解析してビデオとオーディオデータに分ける ( AVIスプリッタフィルタ )
③AVIは圧縮形式なのでビデオをデコード ( 解凍 )する。( 圧縮フォーマットに応じた様々なデコードフィルタ )
④ビデオを描画する ( ビデオレンダラフィルタ )
⑤オーディオをサウンドカードに送る ( デフォルト DirectSound デバイスフィルタ )


↓ 図で示すとこうなる。



図で分かる通り、フィルタ同士は接続されています。
この接続も”ピン”と呼ばれるCOMオブジェクトで行っています。
フィルタは、自分の機能でデータをごにょごにょした後、ピンで接続されている相手にデータを投げます。

上記のようにフィルタがつながっている全体を”フィルタグラフ”を言います。


ビデオファイルの再生において、再生、停止、ポーズという基本的な3つの状態があります。
実行中の場合はフィルタが処理をして、停止の時はフィルタは何もしません。
この流れを管理しているのもフィルタグラフです。


○フィルタのカテゴリ○

・”ソースフィルタ”
 データを読み込んでフィルタに導入する。
 ファイルやネットワークやカメラなどから。
・”変換フィルタ”
 受け取ったデータを一定の処理をして出力する。
 エンコーダやデコーダなど。
・”レンダリングフィルタ”
 一番最後のフィルタ。
 途中で変換したデータを受け取り、それをディスプレイに描画したりサウンドカードに送信して音声の再生をさせる。
 変換したファイルをデスクトップに書き込んだりできる。
・”スプリッタフィルタ”
 受け取ったデータを解析して ビデオ、オーディオ・・・ などに分けてそれぞれを別々のフィルタに出力する。
・”Muxフィルタ”
 複数の入力を受取り一つのデータにする。スプリッタの逆の処理をする。
 たとえば、ビデオとオーディオを受け取って AVIフォーマットで組みなおしたり。


すべてのフィルタは IBaseFilter インターフェイスを継承し
すべてのピンは IPin インターフェイスを継承しています。



【フィルタグラフマネージャについて】

フィルタグラフマネージャはフィルタグラフ内のフィルタを制御する COMオブジェクトです。

他にも「~を再生しました」や「停止しました」等のイベントをアプリケーションに通知したり、
フィルタグラフの作成、接続、接続解除するための関数が複数あります。


フィルタからフィルタへのデータの移動はフィルタ自体がピンを見て行う。
処理は独立したスレッドで行われます。

http://msdn.microsoft.com/ja-jp/library/cc352011.aspx




飽きた