制作了一个简单的FLV播放器,应用了NetConnection类,NetStream类以及Video类,在创建视频之前在NetStream类对象上注册了onMetaData事件和NET_STATUS事件,其中onMetaData事件获取视频文件的总时长,NET_STATUS事件处理函数获得流媒体的下载和播放状态并做相应处理。这段广告视频很不错,强烈推荐。程序还有小BUG,初步完善中。。。。

程序源代码如下:

import flash.media.*;
import flash.net.URLStream;
import flash.net.NetConnection;
var movieTotalTime:Number=0;//总时间
var proTime:Number=0;//已经播放的时间
var dx=drag.x;
var lx=line.x;
var dw=drag.width;
var lw=line.width;
var tempProgress;
var now=true;
btn.buttonMode=true;
line.line_b.scaleX=0;//进度条控制

var videoconnection:NetConnection=new NetConnection();//创建一个NetConnection对象.

videoconnection.connect(null);

var videostream:NetStream=new NetStream(videoconnection);//建立一个NetStream对象,连接到NetConnection里面去.

var myvideo:Video =new Video();

myvideo.attachNetStream(videostream);//Video挂接NetStream,从NetStream那里读内容.

videostream.play("http://www.okxs.net/FLV/1.flv");

var client:Object=new Object();

client.onMetaData=onMetaData;//回调函数,获取总的时间  

videostream.client=client;

function onMetaData(data:Object):void {

 movieTotalTime=Math.round(data.duration);
}

//视频播放前缓冲到一定时间后才自动播放,
videostream.bufferTime=5;

var buffer:Boolean=true;

function onStatus(_evt:NetStatusEvent ):void {
 trace(_evt.info.code);

 if (_evt.info.code=="NetStream.Play.Start") {
  addEventListener(Event.ENTER_FRAME ,onEnterFrame);

 } else if (_evt.info.code=="NetStream.Buffer.Empty") {
  loadmc.visible = true;
  buffer_txt.visible=true;
  buffer=true;//这里表示视频正在缓冲


 } else if (_evt.info.code=="NetStream.Buffer.Full") {
  buffer=false;
  loadmc.visible = false;
  buffer_txt.visible=false;

 }//这里表示视频缓冲区填满了
}

videostream.addEventListener(NetStatusEvent.NET_STATUS,onStatus);

function onEnterFrame(_evt:Event ) {

 //这里就是显示当前缓冲了多少了
 buffer_txt.htmlText=buffer?"正在缓冲:"+Math.floor(videostream.bufferLength/videostream.bufferTime*100)+"%":"";
}

//视频大小和位置的控制
myvideo.x=-337;
myvideo.y=-396;
myvideo.width=483;
myvideo.height=372;
addChild(myvideo);
setChildIndex(myvideo,0);
btn_mc.visible=false;

btn_an.addEventListener(MouseEvent.MOUSE_DOWN,bt_down);
btn.addEventListener(MouseEvent.CLICK,bt_down);

line.addEventListener(MouseEvent.MOUSE_DOWN,dragdown);
line.addEventListener(MouseEvent.MOUSE_UP,dragup);
function dragdown(e:MouseEvent) {
 drag.x=mouseX;
 proTime=(drag.x-dx)/line.width*movieTotalTime;//当前播放的时间
 videostream.seek(proTime);
}
function dragup(e:MouseEvent) {
 removeEventListener(MouseEvent.MOUSE_DOWN,dragdown);
}

addEventListener(Event.ENTER_FRAME,dragmove);

function dragmove(e:Event) {
 if (movieTotalTime!=0) {
  tempProgress=Math.ceil(videostream.time/movieTotalTime*100)/100;
 }
 line.line_b.scaleX=tempProgress;
 drag.x=Math.round(tempProgress*line.width)+dx-dw;
 var ld_minutes=Math.ceil(videostream.time);
 var n_minutes=Math.floor(ld_minutes/60);
 var p_minutes=Math.floor(ld_minutes%60);
 //秒数转化为时间显示
 if (p_minutes<10) {
  if (n_minutes<1) {
   proTitle.text="00"+":"+"0"+String(ld_minutes);
  } else {
   proTitle.text="0"+String(n_minutes)+":"+"0"+String(p_minutes);
  }

 } else {
  proTitle.text="0"+String(n_minutes)+":"+String(p_minutes);
 }
 var str:String;
 var my_minutes=Math.floor(movieTotalTime/60);//得到分钟的正整数
 var my_seconds=Math.floor(movieTotalTime%60);//得到秒钟的正整数
 if (my_seconds<10) {
  str="0"+String(my_seconds);
 } else {
  str=String(my_seconds);
 }
 troTitle.text=String(100+my_minutes).substr(1,2)+":"+str;

}


function bt_down(e:MouseEvent):void {
 now!=now;
 if (now) {
  videostream.pause();
  btn_mc.visible=true;
  btn.gotoAndStop(2);
  now=false;
 } else {
  btn_mc.visible=false;
  videostream.resume();
  btn.gotoAndStop(1);
  now=true;
 }
  if (tempProgress>=1) {
  drag.x=dx;
  btn_mc.visible=false;
  videostream.seek(0);
  videostream.resume();
  

 }

}

//全屏缩放控制
btn_screen.buttonMode=true;
btn_screen.addEventListener(MouseEvent.MOUSE_DOWN,fullScreen);

function fullScreen(e:MouseEvent):void {
 if (stage.displayState==StageDisplayState.NORMAL) {
  stage.displayState=StageDisplayState.FULL_SCREEN;

 } else if (stage.displayState ==StageDisplayState.FULL_SCREEN) {
  stage.displayState=StageDisplayState.NORMAL;
 }
}

//声音控制
var sound:SoundTransform =new SoundTransform();
var volumes:Number=sound.volume;
videostream.soundTransform=sound;
btn_sy.gotoAndStop(7);

for (var j:uint=1; j<=7; j++) {
 var s_btn:MovieClip=btn_sy.an.getChildAt(j-1) as MovieClip;
 s_btn.addEventListener(MouseEvent.MOUSE_DOWN,set_volume);

}

function set_volume(e:MouseEvent):void {
 var _mc=e.currentTarget;
 var k:Number=btn_sy.an.getChildIndex(_mc);
 btn_sy.gotoAndStop(k+1);
 sound.volume=(k+1)/7;
 videostream.soundTransform=sound;
}

  1. 那个进度条的点击 好像不太灵敏 。
    Token 于 2010-6-10 10:24:06 回复
    嗯,是还有点小BUG

    回复

我内心激动,有话要说