※※※※※※【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
飽きた