[AS3教程] AS3视频播放器

知识点]
1、构建视频NetConnection和NetStream;
2、音量掌握用soundTransform(这个让wo耗了一些精神,在AS2中可以setvolume,在AS3就不行了);
3、暂停用pause(),恢复回放暂停的视频流用resume();
4、接受视频信息用onMetaData(如视频总时光data.duration);
5、侦听视频流的开端和停止用NetStatusEvent.NET_STATUS,info.code如果为"NetStream.Play.Stop",则可重播或播放新的视频;
//以上只是一些最基础的视频知识,盼望对初学AS3的人能有所收获,这将是wo最大的欣慰。

[步骤]
第一步:创立播放按钮、暂停按钮,实例名分离为play_btn、pause_btn;
第二步:画两个长矩形,分离转为影片剪辑,实例名分手为jzjd_mc、bfjd_mc,作为加载进度条与播放进度条;
第三步:在库中右键选择“新建视频”,在弹出的对话框中点选“视频(受ActionScript掌握)”,拖到场景中,实例名为vid;
第四步:在场景中拉两个动态文本,实例名分离为bftxt(显示播放时光)、zcdtxt(显示总光阴);
第五步:画一个长矩形,qq聊天室,转为影片剪辑,作为音量条,实例名为ylt_mc;
第六步:画一个小圆,转为影片剪辑,作为音量滑块,实例名为ylhk_mc;
第七步:在帧上写如下代码:

[代码]
//创立一个 NetConnection 对象
var nc:NetConnection=new NetConnection();
/*如果衔接到没有使用服务器的FLV 文件,则通过向 connect() 方式传递值
null,来播放流式 FLV 文件*/
nc.connect(null);
/*创立一个 NetStream 对象(该对象将 NetConnection 对象作为参数)并
指定要加载的 FLV 文件*/
var ns:NetStream=new NetStream(nc);
ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");
/*使用 Video 类的 attachNetStream() 方式附加以前创建的 NetStream
对象(视频实例名为vid)*/
vid.attachNetStream(ns);
//音量初始值
var yl:Number=0.5;
var nsyl:SoundTransform=new SoundTransform();
//nsyl.volume=yl
//播放进度与加载进度影片缩放为0
bfjd_mc.scaleX=jzjd_mc.scaleX=0;
//声名变量播放与下载百分比以及总时光(秒)的初始值为0
var bfbfb:int=0;
var xzbfb:int=0;
var _duration:Number=0;
var _scrubbing:Boolean;
//指定在其上调用回调方式的对象
var _client:Object=new Object();
_client.onMetaData=onMetaData;
ns.client=_client;
//按钮可见性与添加侦听事件
play_btn.visible=false;
pause_btn.visible=true;
pause_btn.addEventListener(MouseEvent.CLICK, zt);
play_btn.addEventListener(MouseEvent.CLICK, bf);
//忽略过错
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
function asyncErrorHandler(event:AsyncErrorEvent):void {
}
//暂停
function zt(event:MouseEvent):void {
play_btn.visible=true;
pause_btn.visible=false;
//视频暂停
ns.pause();
}
//播放
function bf(event:MouseEvent):void {
play_btn.visible=false;
pause_btn.visible=true;
//恢复回放暂停的视频流
ns.resume();
addEventListener(Event.ENTER_FRAME,gx);
}
//接受在正播放的 FLV 文件中嵌入的描写性信息时调度
function onMetaData(data:Object):void {
_duration=data.duration;
}
//声名变量播放信号
var bfxh:String;
//侦听视频流的开端和末尾
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);
function statusHandler(event:NetStatusEvent):void {
bfxh=event.info.code;
}
//不断更新进度与文本的显示
addEventListener(Event.ENTER_FRAME,gx);
function gx(event:Event):void {
if (ns.bytesLoaded>0) {
//加载进度
xzbfb=ns.bytesLoaded/ns.bytesTotal*100;
jzjd_mc.scaleX=xzbfb/100;
}
if (_duration>0 && ns.time>0) {
//播放进度
bfbfb=ns.time/_duration*100;
bfjd_mc.scaleX=bfbfb/100;
}
if (bfxh=="NetStream.Play.Stop") {
//播放完毕时的设置
bfbfb=0;
bfjd_mc.scaleX=0;
ns.pause();
ns.seek(0);//将播放头置于视频开端处
play_btn.visible=true;
pause_btn.visible=false;
}
//文本显示内容
bftxt.text=Math.round(ns.time/60)+":"+Math.round(ns.time%60);
zcdtxt.text=Math.round(_duration/60)+":"+Math.round(_duration%60);
//音量节制
yl=(ylhk_mc.x-345)/50;
ylt_mc.scaleX=yl;
nsyl.volume =yl;
ns.soundTransform=nsyl;
//播放掌握
if (_duration>0) {
if (_scrubbing) {
ns.seek(_duration*(bfhk_mc.x-200)/90);
} else {
bfhk_mc.x=ns.time/_duration*90+200;
}
}
}
//音量滑块拖动节制
var fw:Rectangle=new Rectangle(345,328,50,0);//拖动范畴
ylhk_mc.addEventListener(MouseEvent.MOUSE_DOWN,ylhkax);
ylhk_mc.addEventListener(MouseEvent.MOUSE_UP,ylhksk);
stage.addEventListener(MouseEvent.MOUSE_UP,ylhksk);
function ylhkax(event:MouseEvent):void {
ylhk_mc.startDrag(false,fw);
}
function ylhksk(event:MouseEvent):void {
ylhk_mc.stopDrag();
}
//播放滑块拖动节制
var bfhkfw:Rectangle=new Rectangle(200,328,90,0);//拖动范畴
bfhk_mc.addEventListener(MouseEvent.MOUSE_DOWN,bfhkax);
bfhk_mc.addEventListener(MouseEvent.MOUSE_UP,bfhksk);
stage.addEventListener(MouseEvent.MOUSE_UP,bfhksk);
function bfhkax(event:MouseEvent):void {
_scrubbing=true;
bfhk_mc.startDrag(false,bfhkfw);
}
function bfhksk(event:MouseEvent):void {
_scrubbing=false;
bfhk_mc.stopDrag();
}



直接使用以上程序可能报错,没有细找原因。
另附上wo完成的一个我根据以上程序报错修改的程序(不可直接替换)

// 创建回调函数的对象
var customClient:Object = new Object();
// 赋值给NetStream对象的属性client
customClient.onMetaData = metaDataHandler;

var my_nc:NetConnection=new NetConnection();
my_nc.connect(null);
var my_ns = new NetStream(my_nc);
my_ns.client = customClient;
my_ns.play("temp001.flv");
my_video.attachNetStream(my_ns);

//onMetaData回调函数的事件
function metaDataHandler(infoObject:Object):void {
//获得flv文件中嵌入的描述性信息,这里获得获得总持续时间(单位:秒)
var flv_duration:Number = int(infoObject.duration);
var tM:Number = Math.floor(flv_duration/60);
var tS:Number = Math.floor(flv_duration%60);
time_txt.text=""+tM+":"+tS;
}

//音量初始值
var yl:Number=1;
var nsyl:SoundTransform =new SoundTransform(my_ns);
nsyl.volume=yl;
my_ns.soundTransform=nsyl;

posted @ 2010-05-29 11:50  rob_2010  阅读(718)  评论(0编辑  收藏  举报