- 2010-02-15 (月) 18:58
- action script
動画をそのまま再生させて終わりというのではなく、動画の最後までいったらちょっと戻してループさせるとか、映像の特定のタイミングで関数を呼び出したりするときは、
- FLV動画をタイムラインに貼付け、タイムライン上で所定の場所にフレームスクリプトを書いて制御する
- 動画にキューポイントを設定し、制御する
が思い浮かびます。
ただ、1の方法は動画がFLVならOKですが、F4Vだと駄目です。FLVに変換する必要があります。手元にあったのがF4Vだったので2をやってみようと思いました。(結局キューポイントを埋め込むのでFLV変換してもいいんですけどね。)
次に、SWF上にビデオを埋め込むには
- Videoクラスを作って自力でいろいろ実装していく
- FLVPlaybackコンポーネントを使う
- ナビゲーションキューポイント
- イベントキューポイント
- ActionScriptキューポイント
方法があって、(いろいろ不評ポイントはあるものの)コンポーネントを使う方が簡単なのでここも2にする。
さて、F4VってのはCS4の時に採用した動画形式で、要はH.264なんですが、H.264と違ってキューポイントが埋め込めるのがメリット。
キューポイントといっても
の3タイプがあり、1と2はFLV/F4Vに直接埋め込むキューポイントでAdobeMediaEncoderを使って埋め込みます。3はASやFlashIDE上であとから設定できます。
ただ、動画再生ヘッダを所定位置に移動させるseek系の指定先は(時間を直接指定する方法もありますが、キューポイントを指定先に使う場合は)ナビゲーションキューポイントしか使えません。
キューポイントによるナビゲーションの移動は
FLVPlaybackインスタンス.seekToNavCuePoint("キューポイント名")
でいけるとあるが、これが”Invalid seek”だと怒られる。ちゃんとナビゲーションキューポイントを指定しており、他につまづくような箇所はなさそうに思える。
なんだこれと1時間ぐらい格闘したけどわからんかったので、結局seekSeconds(秒数)メソッドを使うようにした。seekSecondsメソッドはseekと違い、引数に小数点以下 3 桁までの精度 (ミリ秒精度)で設定できる。もちろん分は秒に直して指定。1分23秒04(1:23:04)なら、83.04と指定。seekSeconds直後はコンポーネントが停止するみたいなんでmyFLVblayback.play();で再開させる。
それにしてもseekToNavCuePointが使えないのが気になる。海外でも同じInvalid seek症状な人を散見。今後deliciousして情報を追います。
追記:
FLVPlaybackコンポーネントを含む子swfをアンロードした時にFLVの音が残り続ける現象に遭遇。ipuhekeさんと同様の現象だと考え、activeVideoPlayerIndexを設定しようとするも、コンポーネントのプロパティパネルからは設定できないらしく、スクリプトから設定することになる。
もはや設計を見直した方が早そうなので、FLVPlaybackコンポーネント1個用意して、このあたりのサンプルコードを参考に作り直すことにした。
追記:
MetadataEvent.CUE_POINTイベントを監視して、ハンドラ内でキューポイント名分岐させたいとする。
eventObject.vpでインデックス(チャンネル番号的なもの)は取得できるが、eventObject.infoだと[Object Object]が返ってくるので Spark の Dumper を使って
import org.libspark.utils.Dumper; trace(Dumper.toString(eventObject.info));
のようにして中身を覗くと、
$var = {
'type' =< actionscript,←キューのタイプ
'name' =< showTitle,←キュー名
'time' =< 3,←キュー設定した時間
}
が入っている。よってキューポイント名は eventObject.info.name で取得できる。
- Newer: FLV使う時さぁ
- Older: 子swfから親swfの変数・メソッドを呼び出す