Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K

以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害。

用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):

view source

print?

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();

posted @ 2010-11-22 17:17  模西的哥哥  阅读(224)  评论(0编辑  收藏  举报