AS3のFlvPlayBackを試してみる
AS2の時とコードの記述が少し変わったみたい。ポイントはメタデータの取得方法とムービー状態(再生・停止・シークなど)をどう捕まえるか。メタデータに関してはMetadataEventのMETADATA_RECEIVED をリスナーに登録しておいて、受け取るハンドラの中でそれぞれ取り出してやればよい(左上の白文字)。次にムービー状態に関してはVideoEventに捕まえたいイベントオブジェクトを登録しておくだけ。あとはハンドラ内でムービーの再生時間などを処理してやればよい。playheadPercentageを使うと、現在の再生ヘッドが全体の何パーセントなのかを示してくれる。トータルタイムにこのパーセンテージを乗算すれば現在の再生時間が簡単に出せる。
デフォルトのシークバーコンポーネントには再生ヘッドまでのプログレス表示をしてくれない。今回はシークバーと同じ幅のムービークリップをあらかじめシークバーコンポーネントの中に配置しておいてscaleXにplayheadPercentageの値を入れて動作させてみた(シークバーの白い部分)。
{
import flash.display.MovieClip;
import fl.video.MetadataEvent;
import fl.video.FLVPlayback;
import fl.video.VideoEvent;
import flash.text.TextField;
public class Main extends MovieClip
{
//------------------------------
// コンストラクタ
//------------------------------
public function Main()
{
player.source = "test.flv";
player.bufferTime = 1;
player.addEventListener(MetadataEvent.METADATA_RECEIVED, onMetadata);
player.addEventListener(VideoEvent.READY, onReady);
player.addEventListener(VideoEvent.PLAYING_STATE_ENTERED, onPlaying);
player.addEventListener(VideoEvent.PLAYHEAD_UPDATE, onPlayHead);
player.addEventListener(VideoEvent.PAUSED_STATE_ENTERED, onPause);
player.addEventListener(VideoEvent.COMPLETE, onComplete);
player.playPauseButton = playBtn;
player.muteButton = muteBtn;
player.backButton = backBtn;
player.seekBar = seekBar;
player.fullScreenButton = fullScreenBtn;
}
//------------------------------
// メタデータの取得
//------------------------------
private function onMetadata(e:MetadataEvent):void
{
meta.appendText("FrameRate = " + player.metadata.framerate + "\n");
meta.appendText("VideoDataRate = " + player.metadata.videodatarate + "\n");
meta.appendText("Height = " + player.metadata.height + "\n");
meta.appendText("Width = " + player.metadata.width + "\n");
meta.appendText("Duration = " +player.metadata.duration + "\n");
}
//------------------------------
// FLVの初期化
//------------------------------
private function onReady(e:VideoEvent)
{
var time = String(Math.floor(player.totalTime));
var minute = String(Math.floor(time / 60));
var second = String(time % 60);
if (minute <10)
{
minute = "0" + minute;
}
if(second <10)
{
second = "0" + second;
}
total.text = "/ " + minute + ":" + second;
now.text = "00:00";
stateText.text = "PAUSE";
seekBar.seekProgress.scaleX = 0;
}
//------------------------------
// FLVの再生時
//------------------------------
private function onPlaying(e:VideoEvent)
{
stateText.text = "PLAY";
}
//------------------------------
// FLVの再生中
//------------------------------
private function onPlayHead(e:VideoEvent)
{
var time = Math.floor(player.totalTime * player.playheadPercentage / 100);
var minute = Math.floor(time / 60);
var second = time % 60;
if (minute <10)
{
minute = "0" + minute;
}
if(second <10)
{
second = "0" + second;
}
now.text = minute + ":" + second;
//-----[再生ヘッドまでのプログレスバー]
seekBar.seekProgress.scaleX = player.playheadPercentage / 100;
}
//------------------------------
// FLVの一時停止時
//------------------------------
private function onPause(e:VideoEvent)
{
stateText.text = "PAUSE";
}
//------------------------------
// FLVの再生終了時
//------------------------------
private function onComplete(e:VideoEvent)
{
stateText.text = "FINISH";
}
}
}
