Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K
以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害。
用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):
001 import Jimmy.Event.ValueChangeEvent;
002
003 var _autoPlay:Boolean=true;//是否自动播放
004 var _netConn:NetConnection;
005 var _netStream:NetStream;
006 var _duration:Number=0.0;
007 var _client:Object;
008 var _soundTransform:SoundTransform;
009 var _volumn=0.6;//初始音量
010 var _flvUrl = "flv的地址";
011
012 function init():void {
013 txtInfo.text = "";
014 txtInfo.visible = false;
015 txtCurrent.text = "00:00";
016 txtTotal.text = "00:00";
017 silderVideo.Value = 0.0;
018 videoMask.visible = false;
019 txtPercent.text = "";
020 txtPercent.visible = false;
021
022 _netConn = new NetConnection();//创建连接
023 _client = new Object();
024 _soundTransform = new SoundTransform();
025
026 //初始化[暂停]/[播放]按钮可见性
027 if (_autoPlay) {
028 btnPause.visible=true;
029 btnPlay.visible=false;
030 } else {
031 btnPause.visible=false;
032 btnPlay.visible=true;
033 }
034
035 //初始化滑块按钮宽度
036 silderSound.ButtonWidth=35;
037 silderVideo.ButtonWidth=9.5;
038 silderSound.Value = _volumn;
039 silderSound.ShowBarTri = true;
040 silderSound.ShowBar = false;
041
042 //开始连接并播放
043 _netConn.connect(null);
044 _netStream=new NetStream(_netConn);
045 _netStream.bufferTime = 5;
046 wVideo.attachNetStream(_netStream);
047 _netStream.play(_flvUrl);
048 _soundTransform.volume=_volumn;
049 _netStream.soundTransform=_soundTransform;
050 _client.onMetaData = MetaDataHandler;
051 _netStream.client=_client;
052
053 //注册监听事件
054 _netStream.addEventListener(NetStatusEvent.NET_STATUS,NetStatusHandler);
055 btnSound.addEventListener(MouseEvent.MOUSE_OVER,function(){ Mouse.cursor = MouseCursor.BUTTON});
056 btnSound.addEventListener(MouseEvent.MOUSE_OUT,function(){ Mouse.cursor = MouseCursor.AUTO});
057 btnSound.addEventListener(MouseEvent.MOUSE_DOWN,btnSoundMouseDown);
058 btnPlay.addEventListener(MouseEvent.CLICK,btnPlayMouseClick);
059 btnPause.addEventListener(MouseEvent.CLICK,btnPauseMouseClick);
060 btnStop.addEventListener(MouseEvent.CLICK,btnStopMouseClick);
061 silderSound.addEventListener(ValueChangeEvent.VALUE_CHANGE,VolumnChangedHandler);
062 addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
063 silderVideo.addEventListener(MouseEvent.MOUSE_DOWN,silderVideoMouseDown);
064 silderVideo.addEventListener(ValueChangeEvent.VALUE_CHANGE,VideoValueChangedHandler);
065 }
066
067 function NetStatusHandler(e:NetStatusEvent):void{
068 txtInfo.text = "";
069 videoMask.visible = txtPercent.visible = txtInfo.visible = false;
070 trace(e.info.code);
071 switch(e.info.code){
072 case "NetStream.Play.StreamNotFound":
073 txtInfo.text = "错误:视频文件地址无法访问"
074 break;
075 case "NetStream.Play.Failed":
076 txtInfo.text = "错误:视频播放失败"
077 break;
078 case "NetStream.Buffer.Empty":
079 txtInfo.text = "影片缓冲中...";
080 break;
081 case "NetStream.Play.Stop":
082 //txtInfo.text = "播放已停止";
083 break;
084 case "NetStream.Seek.InvalidTime":
085 //txtInfo.text = "错误:无法跳到指定的时间点播放";
086 //trace(e.info.Error);
087 //_netStream.pause();
088 //btnPlay.visible = true;
089 //btnPause.visible = false;
090 break;
091 default:
092 break;
093 }
094
095 if (txtInfo.text.length>0){
096 videoMask.visible = txtPercent.visible = txtInfo.visible = true;
097 }
098 }
099
100 function btnSoundMouseDown(e:MouseEvent) {
101 var i:uint=btnSound.currentFrame;
102 if (i==1) {
103 btnSound.gotoAndStop(2);//切换到静音
104 SetVolumn(0);
105 } else {
106 btnSound.gotoAndStop(1);//切换到有声音
107 SetVolumn(silderSound.Value);
108 }
109 }
110
111 //设置音量
112 function SetVolumn(vol:Number):void {
113 var _snd:SoundTransform = _netStream.soundTransform;
114 _snd.volume = vol;
115 _netStream.soundTransform = _snd;
116 }
117
118 //Play按钮点击事件
119 function btnPlayMouseClick(e:MouseEvent) {
120 //切换按钮可用性
121 btnPause.visible=true;
122 btnPlay.visible=false;
123 //开始播放...
124 _netStream.resume();
125 }
126
127 //Pause按钮点击事件
128 function btnPauseMouseClick(e:MouseEvent) {
129 //切换按钮可用性
130 btnPause.visible=false;
131 btnPlay.visible=true;
132 //暂停...
133 _netStream.pause();
134 }
135
136 //Stop按钮点击事件
137 function btnStopMouseClick(e:MouseEvent) {
138 _netStream.pause();
139 _netStream.seek(0);
140
141 //切换播放/暂停按钮状态
142 btnPause.visible=false;
143 btnPlay.visible=true;
144 }
145
146
147 //获取视频总持续时间
148 function MetaDataHandler(data:Object) {
149 _duration = data.duration;
150 }
151
152 function VolumnChangedHandler(e:ValueChangeEvent):void{
153 //如果没被禁音,则允许调节音量
154 if (btnSound.currentFrame==1){
155 SetVolumn(e.NewValue);
156 }
157 }
158
159 function VideoValueChangedHandler(e:ValueChangeEvent):void{
160 _netStream.pause();
161 _netStream.seek(e.NewValue * _duration);
162 //_netStream.resume();
163 }
164
165 //进入每帧的处理函数
166 function EnterFrameHandler(e:Event):void{
167 if (_duration>0){
168 txtCurrent.text = Math.floor(_netStream.time/60) + ":" + Math.round(_netStream.time%60);
169 txtTotal.text = Math.floor(_duration/60) + ":" + Math.round(_duration%60);
170 silderVideo.Value = _netStream.time/_duration;
171 }
172 if (_netStream.bytesLoaded>0){
173 silderVideo.LoadingValue = _netStream.bytesLoaded / _netStream.bytesTotal;
174 }
175
176 //trace(_netStream.bytesLoaded + "/" + _netStream.bytesTotal);
177 }
178
179
180 function RemoveEnterFrameHandler(){
181 if (silderVideo.IsDragging){
182 removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);
183 }
184 else{
185 addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
186 }
187 }
188
189
190 function silderVideoMouseDown(e:MouseEvent):void{
191 //trace("进度滑块被点击了!");
192 removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);
193 stage.addEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);
194 }
195
196 function stageMouseUpHandler(e:MouseEvent):void{
197 addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
198 //trace("鼠标MouseUp事件");
199
200 if (btnPause.visible){
201 _netStream.resume();
202 }
203 stage.removeEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);
204 }
205
206 init();
浙公网安备 33010602011771号