▼Adobe AIRメモ▼
FLVプレイヤー


FLVプレイヤーを作成する。


リソース
FLVUI.swf


ソースコード
FLVPlayerEx.as
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;
                }
            }
        }
    }
 }


−戻る−