以前为了赶项目,利用系统组件制作过一款视频播放器(见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();