吉里吉里2/KAG3 機能仕様書 / 動画再生機能

Topへ

# 動画再生機能

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

### 目次

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

諸元

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

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 依存のため、しばしば意図しない動作が行われます。
そのため、シークを行うフレームへは必ずキーフレームを設定するようにした方が良いです。