以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害。
用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):
import Jimmy.Event.ValueChangeEvent; var _autoPlay:Boolean=true;//是否自动播放 var _netConn:NetConnection; var _netStream:NetStream; var _duration:Number=0.0; var _client:Object; var _soundTransform:SoundTransform; var _volumn=0.6;//初始音量 var _flvUrl = "flv的地址"; function init():void { txtInfo.text = ""; txtInfo.visible = false; txtCurrent.text = "00:00"; txtTotal.text = "00:00"; silderVideo.Value = 0.0; videoMask.visible = false; txtPercent.text = ""; txtPercent.visible = false; _netConn = new NetConnection();//创建连接 _client = new Object(); _soundTransform = new SoundTransform(); //初始化[暂停]/[播放]按钮可见性 if (_autoPlay) { btnPause.visible=true; btnPlay.visible=false; } else { btnPause.visible=false; btnPlay.visible=true; } //初始化滑块按钮宽度 silderSound.ButtonWidth=35; silderVideo.ButtonWidth=9.5; silderSound.Value = _volumn; silderSound.ShowBarTri = true; silderSound.ShowBar = false; //开始连接并播放 _netConn.connect(null); _netStream=new NetStream(_netConn); _netStream.bufferTime = 5; wVideo.attachNetStream(_netStream); _netStream.play(_flvUrl); _soundTransform.volume=_volumn; _netStream.soundTransform=_soundTransform; _client.onMetaData = MetaDataHandler; _netStream.client=_client; //注册监听事件 _netStream.addEventListener(NetStatusEvent.NET_STATUS,NetStatusHandler); btnSound.addEventListener(MouseEvent.MOUSE_OVER,function(){ Mouse.cursor = MouseCursor.BUTTON}); btnSound.addEventListener(MouseEvent.MOUSE_OUT,function(){ Mouse.cursor = MouseCursor.AUTO}); btnSound.addEventListener(MouseEvent.MOUSE_DOWN,btnSoundMouseDown); btnPlay.addEventListener(MouseEvent.CLICK,btnPlayMouseClick); btnPause.addEventListener(MouseEvent.CLICK,btnPauseMouseClick); btnStop.addEventListener(MouseEvent.CLICK,btnStopMouseClick); silderSound.addEventListener(ValueChangeEvent.VALUE_CHANGE,VolumnChangedHandler); addEventListener(Event.ENTER_FRAME,EnterFrameHandler); silderVideo.addEventListener(MouseEvent.MOUSE_DOWN,silderVideoMouseDown); silderVideo.addEventListener(ValueChangeEvent.VALUE_CHANGE,VideoValueChangedHandler); } function NetStatusHandler(e:NetStatusEvent):void{ txtInfo.text = ""; videoMask.visible = txtPercent.visible = txtInfo.visible = false; trace(e.info.code); switch(e.info.code){ case "NetStream.Play.StreamNotFound": txtInfo.text = "错误:视频文件地址无法访问" break; case "NetStream.Play.Failed": txtInfo.text = "错误:视频播放失败" break; case "NetStream.Buffer.Empty": txtInfo.text = "影片缓冲中..."; break; case "NetStream.Play.Stop": //txtInfo.text = "播放已停止"; break; case "NetStream.Seek.InvalidTime": //txtInfo.text = "错误:无法跳到指定的时间点播放"; //trace(e.info.Error); //_netStream.pause(); //btnPlay.visible = true; //btnPause.visible = false; break; default: break; } if (txtInfo.text.length>0){ videoMask.visible = txtPercent.visible = txtInfo.visible = true; } } function btnSoundMouseDown(e:MouseEvent) { var i:uint=btnSound.currentFrame; if (i==1) { btnSound.gotoAndStop(2);//切换到静音 SetVolumn(0); } else { btnSound.gotoAndStop(1);//切换到有声音 SetVolumn(silderSound.Value); } } //设置音量 function SetVolumn(vol:Number):void { var _snd:SoundTransform = _netStream.soundTransform; _snd.volume = vol; _netStream.soundTransform = _snd; } //Play按钮点击事件 function btnPlayMouseClick(e:MouseEvent) { //切换按钮可用性 btnPause.visible=true; btnPlay.visible=false; //开始播放... _netStream.resume(); } //Pause按钮点击事件 function btnPauseMouseClick(e:MouseEvent) { //切换按钮可用性 btnPause.visible=false; btnPlay.visible=true; //暂停... _netStream.pause(); } //Stop按钮点击事件 function btnStopMouseClick(e:MouseEvent) { _netStream.pause(); _netStream.seek(0); //切换播放/暂停按钮状态 btnPause.visible=false; btnPlay.visible=true; } //获取视频总持续时间 function MetaDataHandler(data:Object) { _duration = data.duration; } function VolumnChangedHandler(e:ValueChangeEvent):void{ //如果没被禁音,则允许调节音量 if (btnSound.currentFrame==1){ SetVolumn(e.NewValue); } } function VideoValueChangedHandler(e:ValueChangeEvent):void{ _netStream.pause(); _netStream.seek(e.NewValue * _duration); //_netStream.resume(); } //进入每帧的处理函数 function EnterFrameHandler(e:Event):void{ if (_duration>0){ txtCurrent.text = Math.floor(_netStream.time/60) + ":" + Math.round(_netStream.time%60); txtTotal.text = Math.floor(_duration/60) + ":" + Math.round(_duration%60); silderVideo.Value = _netStream.time/_duration; } if (_netStream.bytesLoaded>0){ silderVideo.LoadingValue = _netStream.bytesLoaded / _netStream.bytesTotal; } //trace(_netStream.bytesLoaded + "/" + _netStream.bytesTotal); } function RemoveEnterFrameHandler(){ if (silderVideo.IsDragging){ removeEventListener(Event.ENTER_FRAME,EnterFrameHandler); } else{ addEventListener(Event.ENTER_FRAME,EnterFrameHandler); } } function silderVideoMouseDown(e:MouseEvent):void{ //trace("进度滑块被点击了!"); removeEventListener(Event.ENTER_FRAME,EnterFrameHandler); stage.addEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler); } function stageMouseUpHandler(e:MouseEvent):void{ addEventListener(Event.ENTER_FRAME,EnterFrameHandler); //trace("鼠标MouseUp事件"); if (btnPause.visible){ _netStream.resume(); } stage.removeEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler); } init();