« 各種ビデオパラメータの取得 | メイン | IBasicVideoの実装 »

2004年08月26日

吉里吉里2/KAG3ムービー拡張日誌:: 現在の時間とフレーム

    

再生中にIMediaSeeking::SetTimeFormatを使って、タイムフォーマットを頻繁に切り替えると再生が乱れる。どうやら、タイムフォーマットを変更すると何らかの初期化が行われているようだ。
そうすると、再生中にはタイムフォーマットの変更は出来なくなる。

IMediaSeeking::ConvertTimeFormatを使用すれば、他のフォーマットへ変換できるが、自分の環境では、フレームからメディアタイムへの変換は出来たが、メディアタイムからフレームへの変換は実装されていないと出た。
どうやら、IMediaSeeking::ConvertTimeFormatは万能ではないようだ。
FPSを使用すれば、ある程度は自前で変換できる。
出来る限り厳密な設定を望むのなら、タイムフォーマットはメディア タイムを設定しておくべきだが、私の個人的な見解では、設定はフレームで行いたい。
でも、取得は時間の方が都合が良さそうだ。
さて、どうしたものか。
タイムフォーマットにフレームが設定可能であればフレームを、そうでなければメディア タイムとしておくかな。
つまり、フレームを基準として動作させることにする。
細かい時間での制御が出来なくなるが、フレーム以上の精度で何かを制御することはあまりないであろう。
よって、以下のような仕様とする。

合計時間と合計フレーム数はグラフ構築時に取得し、保持しておく。また、同時にFPSも計算し保持する。
タイムフォーマットもグラフ構築時に問い合わせを行い、フレームが利用可能であればフレームに設定。利用できない場合はメディア タイムに設定。もし、両方が利用できない場合は、現在時間の取得や設定は利用できない物とする。
フレームが利用できない場合は、合計フレーム数やFPS、現在のフレームの取得/設定は利用できない。つまり、メディア タイム(100ナノsec単位)での制御となる。

以上のような仕様にするのはいいものの、フレームが利用できないといろいろと痛い。ムービー内ループが利用できなくなる。
FPSが他の方法によって取得できれば何とかなるのだが・・・
もう少し調べてみなければならなそうだ。

AM_MEDIA_TYPEのVIDEOINFOHEADERにはビデオ フレームの平均表示時間がある。これを利用すればFPSを得られる!
オーバーレイの場合は、IBasicVideoを取得すればビデオ フレームの平均表示時間が得られる。
でも、出来れば独自レンダーの方も同じようにIBasicVideoを使用したい。調べるとCBaseBasicVideoというベースクラスがあった。しかし、これは少々ややこしそうだ。もう少し見るとCBaseControlVideoが見つかった。こちらの方が簡単に実装できそうだ。
しかし、実装したとしても、どうやればグラフビルダのQueryInterfaceで返されるようになるのかは現在不明。
良いサンプルがあるといいが。

Filters/SampVidが役に立ちそうだ。
でも、単にクエリーの時に返しているような感じだな。
次はCBaseControlVideoの実装だ。
にしても、独自レンダーは次々に拡張されていくなぁ・・・



投稿者 Takenori : 2004年08月26日 11:36




comments powered by Disqus
Total : Today : Yesterday : なかのひと