動画再生機能

吉里吉里Z がサポートする動画再生機能ついて記載。

目次

諸元
モード
特殊再生機能
動画再生準備について ( preparevideo )
レイヤーモードでのレイヤー指定について
動画終端での振る舞い
レイヤーモードで動画が表示されない現象について
ミキシング再生
キーフレームとシーク



モード オーバーレイモード ビデオオーバーレイを使用して動画を表示するモード
レイヤーモード 吉里吉里内のレイヤーで動画を再生するモード
ミキサーモード VMR9 + Direct3D を使用して動画を表示するモード
特殊再生機能 セグメントループ 指定されたフレーム間をループする機能
ピリオドイベント 指定されたフレームでイベントを発生させる機能
再生速度指定 動画の再生速度を指定する機能
マルチオーディオ 多重化された音声のうち、1つを選択して再生する機能
音声バランス
(パニング)
-100000 ~ 0
~ 100000
-100000 が 完全に左、0 が中央、100000 が完全に右。
ステレオのソースを再生する場合は、パンは、
左右どちらかのチャンネルを減衰させることで実現される。
音声ボリューム 0 ~ 100000 0 が完全ミュート、100000 が 100% の音量
音声ストリーム コンテンツに依存 再生する音声ストリームを選択
再生速度 >0 設定可能値はDirectShowのフィルタ依存。
音声ありの場合、2.0≧速度>0。
1.0が等倍速。
取得可能値 フレームレート 1秒当りのフレーム数
現在のフレーム 現在表示しているフレーム。
表示しているフレーム番号と完全に一致する保証はない。
現在の再生時間 動画の最初からの動画内での経過時間。
画像サイズ 幅と高さ
音声ストリーム数 多重化されている音声ストリームの数
全フレーム数 動画が保持しているフレームの数
合計時間 動画の合計時間
イベント フレーム更新 ビデオフレームが更新された後に発生
Periodイベント 通常ループ終端、セグメントループ終端、
設定したピリオドイベント、再生準備完了時に発生。
ステータス変更 再生状態が変更された時に発生



種類説明
オーバーレイモード ビデオオーバーレイを使用して動画を表示するモードです。
吉里吉里内の他のどのレイヤーよりも手前に表示されます。
ほとんどの場合、ムービーの再生は最も軽くなります。
単純に動画を再生して停止するだけであれば、オーバーレイモードを使用するのが良いです。
しかし、Windows Vista と Windows XP で吉里吉里の描画モードがDirectDrawの時に一部の環境において、オーバーレイモード時に拡大すると綺麗に拡大されない(ジャギーが発生する)という現象が報告されています。
このため Windows Vista ではオーバーレイモードは避けた方が良いです。
レイヤーモード 吉里吉里内の指定のレイヤーで動画を再生するモードです。
環境依存性が低く、指定フレーム間でのループ(セグメントループ)や指定フレームでの処理(ピリオドイベント)などの機能が使用可能です。
ただ、他のモードよりもCPU負荷が高くなるという難点があります。
また、拡大縮小も出来ません。
ミキサーモード オーバーレイモードの代替として追加された、VMR9 + Direct3D を使用して動画を表示するモードです。
ビデオカードにビデオ再生支援機能があり、コーデックが対応していれば、ビデオカードのビデオ再生支援機能を使用して再生可能です。
Windows Vista での拡大時のジャギー問題も回避されます。
また、指定レイヤーとのミキシングや拡大縮小も可能です。
使用するには DirectX 9 以降が必要です。



種類説明
セグメントループ 指定されたフレーム間をループする機能です。
この機能を使用するためには、動画ファイル自体にループで戻る先のフレームにキーフレームを設定しておく必要があります。
キーフレームがない場合、期待したようにループされません。
ピリオドイベント 指定されたフレームでイベントを発生させ、何らかの処理ができる機能です。
イベント発生時に、離れたフレームにシークすることで、間のフレームを飛ばして、あたかも動画がつながっているように見せることが可能です。
また、動画にあわせて字幕を出したい時なども、字幕の開始フレームにピリオドイベントを設定し、イベントを待って文字を表示することで実現可能です。
他に、この機能を使えば、動画自体には音を入れず、指定フレームでSEを使って音を鳴らすことも可能です。
再生速度コントロール 動画の再生速度が指定可能です。
1.0 を指定すると通常の再生速度、0.5 では半分の再生速度、2では2倍の再生速度になります。
設定可能な値は DirectShowのフィルタ (Codec) に依存します。
マルチオーディオ MPEG I では、複数のオーディオストリームを多重化可能なため、それを利用する機能です。
この機能では、任意のオーディオストリームを再生することが可能です。
たとえば、BGMのみ、BGM+声などのストリームを準備しておき、ユーザーがどのモードで再生するか指定可能にすることなどが出来ます。
ただ、オーディオストリームの切り替えには2秒程度のタイムラグがあるため、あまりインタラクティブな用途には向いていません。
上記のユーザーによる選択やシーンによって動画音声が変わるような用途に使えます。


preparevideo は、動画の1フレーム目を指定されたレイヤーに描画します。
これは、意図しない画像(メモリ上のごみや前回の画像など)が画面上に表示されるのを防ぐ目的で利用されます。
つまり、再生対象としたレイヤーを非表示にして、動画を openvideo で開いた後、preparevideo をコールし、wp で準備完了を待ち、準備できた後に再生対象レイヤーを表示状態にするような処理を記述することで、表示した時に動画の1フレーム目を表示することが出来ます。
なお、この機能はレイヤーモードの時のみ意味を持ちます。



レイヤーモードで動画を再生する場合、videolayer を使用して、描画対象レイヤーを指定します。
videolayer では、slotとchannel, page, layer が指定できます。
slot は、se の buf に相当するもので、異なるビデオを同時に再生する時に、どのビデオに対する操作かを特定するためにあります。
複数の動画を同時に再生することはほとんどないと思いますので、通常は記述を省略し、0 が指定されるようにしておけば問題ありません。
channel は、出力するレイヤーを指定するためにあります。
1つの動画に付き2つまで出力するレイヤーを指定できるので、そのどちらに対する指定かを特定するために利用します。
2つ指定可能になっているのは、トランジションを利用するためです。
動画再生中にトランジションを実行すると、表と裏のレイヤーが入れ替わるため、片方にしか出力していないと、動画が非表示になってしまいます。
これを避けるため、動画再生中にトランジションを行う場合は、チャンネルの1と2に表と裏のレイヤーを設定しておきます。トランジションを行わないのであれば、表面だけ指定しておけば問題ありません。



ループを指定せずに動画を再生すると、最後まで再生したら動画は停止します。
動画の最後のフレームを表示したままゲームを進行したい場合、この動作は好ましくありません。
これを回避する最も簡単な方法はレイヤーモードを使用することです。
レイヤーモードでは、レイヤーに対して動画が描画されるため、最後のフレームの画像がそのままレイヤーに残ります。
そのため、特に意識することなく、最後のフレームを表示したままゲームを進行出来ます。
オーバーレイやミキサーの場合は、停止すると表示が消えてしまうため、最終フレームに達する前に一時停止しなければなりません。
これは、ピリオドイベントで実現できますが、本当に最終フレームにしてしまうと、停止してしまう可能性があるため、動画の末尾に数フレームダミーフレームを入れておき、少し通り越しても大丈夫なようにしておいた方が良いです。



動画の再生対象としたレイヤーの表示タイプがアルファなどになっていると、動画が表示されないという事態が発生します。
これは、動画がアルファチャンネルを持っていない場合、アルファチャンネルの位置に不定データが書き込まれるためです。
レイヤー表示タイプがアルファになっている場合、この不定データがアルファ値として扱われるため、完全に透明になってしまったりします。
これを回避するためには、再生対象レイヤーの表示タイプをopaqueにしてやります。
そうすると動画が表示されるようになります。
ただ、KAGではopaqueにし辛いので、代わりに freeimage を呼んでも同様の効果が得られるようです。



ミキサーモードはその名の通り、他のレイヤーと動画をミキシングして再生することを実現できます。
ミキサーモードでミキシングに関係して指定できるのは、背景色、ブレンド率、ミキシング対象レイヤーです。
ミキシング対象レイヤーは、設定した瞬間の画像と動画がミキシングされます。
そのため、ミキシング対象レイヤーが更新されても、再度設定しない限り内容は更新されません。
ただ、毎フレームの更新時に設定をコールすると、かなりCPU負荷が高くなります。
CPU負荷を抑えるために、設定する場合は、更新された時のみに限定した方が良いです。
背景色は、ブレンド率を1.0未満にした場合にブレンドされる色です。
背景色を黒などに設定し、ブレンド率を変化させることで、フェードイン/アウトが実現できます。
当然、ミキシング対象レイヤーとのフェードイン/アウト可能です。
ミキシング対象レイヤーとのブレンド率やレイヤー位置はレイヤーの情報が使われます。
つまり、表示位置はレイヤーの位置にブレンド率はレイヤーの不透明度に依存します。
ただ、レイヤーとのブレンドは毎回指定する必要があるという仕様から、レイヤーとフェードイン/アウトをするとCPU負荷が高くなってしまいます。



吉里吉里ではシークを高速に行うため、シーク可能位置をキーフレームに限定しています。
キーフレーム以外のフレームを指定した場合、指定フレームに最も近いキーフレームへシーク処理が行われます。
ただし、この動作は Codec 依存のため、しばしば意図しない動作が行われます。
そのため、シークを行うフレームへは必ずキーフレームを設定するようにした方が良いです。