2007.12.12
category
tag
comments

AS3のFlvPlayBackを試してみる

AS2の時とコードの記述が少し変わったみたい。ポイントはメタデータの取得方法とムービー状態(再生・停止・シークなど)をどう捕まえるか。メタデータに関してはMetadataEventのMETADATA_RECEIVED をリスナーに登録しておいて、受け取るハンドラの中でそれぞれ取り出してやればよい(左上の白文字)。次にムービー状態に関してはVideoEventに捕まえたいイベントオブジェクトを登録しておくだけ。あとはハンドラ内でムービーの再生時間などを処理してやればよい。playheadPercentageを使うと、現在の再生ヘッドが全体の何パーセントなのかを示してくれる。トータルタイムにこのパーセンテージを乗算すれば現在の再生時間が簡単に出せる。

デフォルトのシークバーコンポーネントには再生ヘッドまでのプログレス表示をしてくれない。今回はシークバーと同じ幅のムービークリップをあらかじめシークバーコンポーネントの中に配置しておいてscaleXにplayheadPercentageの値を入れて動作させてみた(シークバーの白い部分)。

package
{
	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.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";
		}
	}
}
page 1 / 11