« Visual C++のコンパイラが無償ダウンロード可能になってた | メイン | WMVからの読み出し »
2005年10月15日
動画エンコーダー開発:: エンコーダはフィルタでなくてもいい?
Tweet @jin1016をフォローもとにしたソースがエンコーダとマルチプレクサをDirectShowのフィルタとして実装していたので、何の気なしにそのままフィルタとして使っていたが、良く考えたらフィルタである必要はない。
と言うか、フィルタでない方が使いやすそうだ。
DirectShowにはメディア ディテクタ (MediaDet)という、ヘルパー オブジェクトが存在する。
これを使うと指定した動画ファイルの指定したフレームの画像を楽に取得できる。
このメディア ディテクタは内部にフィルタグラフを持ち、間接的にそれらを呼び出すことによって、そのような機能を実装している。
吉里吉里のVideoOverlyオブジェクトも似たようなもので、内部にフィルタグラフを持って、楽にビデオの再生が出来るようになっている。
今のエンコーダーのソースでも、エンコーダーと言うオブジェクトがフィルタグラフを持っていて、そいつに対して入力ファイルと出力ファイルを指定し、Startを呼ぶとエンコードが出来るような構成になっている。
この部分はこのような形でいいと思うが、入力データを受け取る部分も、このような形にした方が良さそうだ。
エンコーダーに渡す画像データや音声データは、動画データの初めから順番にデータを受け取って順次エンコードしていくので、キューのような構造である方が使いやすい。
つまり、フィルタグラフを内部に持ってて、画像データなどを順次取得できるヘルパー オブジェクトを作った方が良さそうだ。(独自のレンダーフィルタを作る必要がありそうたが)
このようにすれば、連番静止画などへの対応もしやすい。
インターフェイスが共通の連番静止画用のクラスを作れば簡単に対応できそうだ。
DirectShowのフィルタの問題点は作るのが面倒だってこと。
仕様が良くわからないことが多いし、実装しなければならないメソッドも多いので大変。
それを解消するためにDirectX Media Object(DMO)と言うものがあるようだが、詳しくはまだ見ていない。
投稿者 Takenori : 2005年10月15日 07:14
comments powered by Disqus