package {
import flash.desktop.*;
import flash.display.*;
import flash.events.*;
import flash.filesystem.*;
import flash.media.*;
import flash.net.*;
import flash.system.*;
import flash.ui.*;
import flash.utils.*;
//FLVプレーヤー
public class FLVPlayer extends Sprite {
//素材クラスの定義
[Embed(source='FLVUI.swf',symbol='SKIN')]
private var SKIN:Class;
//スキン
private var skin:Sprite; //スキン
private var screen:Sprite; //スクリーン
private var pickSeek:SimpleButton;//シークつまみ
private var pickVol:SimpleButton; //ボリュームつまみ
private var barSeek:Sprite; //シークバー
private var barVol:Sprite; //ボリュームバー
private var dragTarget:Object; //ドラッグターゲット
//ビデオ
private var video:Video; //ビデオ
private var con:NetConnection;//コネクション
private var stream:NetStream; //ストリーム
private var totalTime:Number; //トータル時間
private var path:String; //パス
//コンストラクタ
public function FLVPlayer() {
//スキン
skin=new SKIN();
skin.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
skin.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
skin.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
skin.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
skin.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);
addChild(skin);
//シンボルの取得
pickSeek=SimpleButton(skin.getChildByName("pickSeek"));
pickVol =SimpleButton(skin.getChildByName("pickVol"));
barSeek =Sprite(skin.getChildByName("barSeek"));
barVol =Sprite(skin.getChildByName("barVol"));
screen =Sprite(skin.getChildByName("screen"));
//ビデオの生成
video=new Video(screen.width,screen.height);
video.x=screen.x;
video.y=screen.y;
skin.addChild(video);
//タイマーの追加
var timer:Timer=new Timer(100,0);
timer.addEventListener(TimerEvent.TIMER,onTick);
timer.start();
//起動引数
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE,onInvoke);
}
//起動引数イベントの処理
private function onInvoke(evt:InvokeEvent ):void {
var i:int;
var file:File;
for (i=0;i<evt.arguments.length;i++){
file=new File(evt.arguments[i]);
play(file.nativePath);
return;
}
}
//タイマーイベントの処理
private function onTick(evt:TimerEvent):void {
//シークつまみの位置調整
if (stream!=null && dragTarget==null &&
stream.bufferLength>stream.bufferTime) {
pickSeek.x=100+Math.floor(260*(stream.time/totalTime));
if (pickSeek.x>100+260) pickSeek.x=100+260;
}
}
//FLVの再生
private function play(path:String):void {
pause();
this.path=path;
con=new NetConnection();
con.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
con.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
con.connect(null);
}
//FLVの停止
private function pause():void {
if (stream!=null) stream.pause();
}
//シークの指定(0.0〜1.0)
public function setSeek(pos:Number):void {
if (stream==null) return;
stream.seek(pos*totalTime);
}
//ボリュームの指定(0.0〜1.0)
private function setVolume(vol:Number):void {
if (stream==null) return;
var trans:SoundTransform=stream.soundTransform;
trans.volume=vol;
stream.soundTransform=trans;
}
//マウスダウンイベントの処理
private function onMouseDown(evt:MouseEvent):void {
var name:String=evt.target.name;
if (name=="pickSeek") {
dragTarget=evt.target;
} else if (name=="pickVol") {
dragTarget=evt.target;
} else if (name=="exit") {
stage.nativeWindow.close();
} else {
stage.nativeWindow.startMove();
}
}
//マウスアップイベントの処理
private function onMouseUp(evt:MouseEvent):void {
if (dragTarget==null) return;
if (dragTarget.name=="pickSeek") {
setSeek((dragTarget.x-barSeek.x)/barSeek.width);
}
dragTarget=null;
}
//マウスムーブイベントの処理
private function onMouseMove(evt:MouseEvent):void {
if (dragTarget==null) return;
dragTarget.x=mouseX;
//シークの設定
if (dragTarget.name=="pickSeek") {
if (pickSeek.x<barSeek.x) {
if (pickSeek.x<barSeek.x-50) dragTarget=null;
pickSeek.x=barSeek.x;
} else if (pickSeek.x>barSeek.x+barSeek.width) {
if (pickSeek.x>barSeek.x+barSeek.width+50) dragTarget=null;
pickSeek.x=barSeek.x+barSeek.width;
} }
//ボリュームの設定
else if (dragTarget.name=="pickVol") {
if (pickVol.x<barVol.x) {
if (pickVol.x<barVol.x-50) dragTarget=null;
pickVol.x=barVol.x;
} else if (pickVol.x>barVol.x+barVol.width) {
if (pickVol.x>barVol.x+barVol.width+50) dragTarget=null;
pickVol.x=barVol.x+barVol.width;
}
setVolume((pickVol.x-barVol.x)/barVol.width);
}
}
//通信状態イベントの処理
private function onNetStatus(evt:NetStatusEvent):void {
switch (evt.info.code) {
//成功
case "NetConnection.Connect.Success":
//ストリームの生成
stream=new NetStream(con);
stream.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
//ストリームのクライアント指定
var client:Object=new Object();
client.onMetaData=onMetaData;
stream.client=client;
//再生
stream.play(path);
video.attachNetStream(stream);
break;
//ファイルが見つからない
case "NetStream.Play.StreamNotFound":
break;
}
}
//メタデータ取得イベントの処理
private function onMetaData(info:Object):void {
this.totalTime=info.duration;
}
//セキュリティーエラーイベントの処理
private function onSecurityError(evt:SecurityErrorEvent):void {
}
//ドラッグイエンターイベントの処理
public function onDragEnter(evt:NativeDragEvent):void {
//クリップボードの取得
var cb:Clipboard=evt.clipboard;
//ドラッグ可能かどうかのチェック
if (cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
//ドロップの許可
NativeDragManager.acceptDragDrop(skin);
}
}
//ドロップイベントの処理
public function onDragDrop(evt:NativeDragEvent):void {
//クリップボードの取得
var cb:Clipboard=evt.clipboard;
//テキストのドロップ
if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
var dropfiles:Array=cb.getData(
ClipboardFormats.FILE_LIST_FORMAT) as Array;
for each (var file:File in dropfiles) {
play(file.nativePath);
break;
}
}
}
}
}
|