日期:2014-05-16  浏览次数:20717 次

linux下的fms2流媒体服务器搭建六部曲之五:flv播放器制作篇

linux下的fms2流媒体服务器搭建六部曲之五:flv播放器制作篇
2010年01月03日
  很多人也许苦于找不到一个稍微简单而又完整的flv播放器,我刚开始也找了很久找不到,后来干脆叫朋友帮忙做了个界面,然后自己添加代码做了个,感觉还可以,这里我不敢独享,把源码公开给各位参考一下。
  要做flv播放器,首先你要明白fms2的工作目录,它的工作目录都在安装目录的applications目录下,你需要新建一个目录作为自己的工作目录,比如我新建了gdrc,然后在gdrc里面新建一个streams目录(这个目录名不能改变),这样,在streams下的所有子目录都是你的应用了。默认是_definst_,我为了好管理自己建了video放置视频flv文件,再建audio放置音频,这样我的目录结构就是:applications/gdrc/streams/video、applications/gdrc/streams/audio、applications/gdrc/streams/_definst_。在上一篇中提到的格式转换转换的所有flv文件就是放在applications/streams/video目录下。
  然后,来看看我的flv播放器吧,我是用flash8开发的,只需要几个简单的组件,视频组件、播放按钮、暂停按钮、停止按钮、时间轴再加下面的代码就是一个flv播放器,在第一祯写上下面的代码:
  stop();
  var play_status = false;//视频播放标记,true-正在播放;false-没有播放
  var connect_url = "rtmp://172.16.1.2/gdrc/video";//连接方式rtmp,注意这个连接的后面/gdrc/video跟上面提到的flv目录applications/gdrc/streams/video是对应的。
  var flv = stream;//动态播放flv,该参数名对应外面的参数名比如play.swf?stream=a表示播放a.flv,参数不需要.flv后缀名
  var nc:NetConnection = new NetConnection();
  var ns:NetStream;
  nc.connect(connect_url);
  var streamLength;//flv文件长度
  bt_pause._visible = false;//设置暂停按钮不可见
  var startBF = 2;//开始缓冲秒数
  var mainBF = 6;//空时缓冲秒数
  //初始化
  initStreams = function(){
  ns=new NetStream(nc);
  ns.setBufferTime(startBF);
  video.attachVideo(ns);//把ns附给video视频组件
  ns.onStatus = Onstatus;//动态缓冲
  };
  //动态缓冲,缓冲区满时为3秒,空的时候为10秒
  function Onstatus(infoObject:Object){
  trace(infoObject["code"]);
  if(infoObject["code"] == "NetStream.Buffer.Full"){
  ns.setBufferTime(startBF);
  }
  if(infoObject["code"] == "NetStream.Buffer.Empty"){
  ns.setBufferTime(mainBF);
  }
  }
  //测试连接
  nc.onStatus = function(info) {
  trace(info.code);
  switch (info.code) {
  case "NetConnection.Connect.Success":initStreams();break;
  }
  }
  //缓冲
  function checkBufferTime(ns:NetStream):Void{
  var bufferPct:Number = Math.min(Math.round(ns.bufferLength/ns.bufferTime*100), 100);
  if(isNaN(bufferPct)){
  bufferPct = 0;
  }
  buffer_txt = "缓冲:"+bufferPct+"%";;
  };
  //获得文件长度,这个长度的获取需要服务器端的支持,要在fms2服务器端编写main.asc,后面会给出
  function FileLength() {
  this.onResult = function(retVal) {
  streamLength = retVal;
  };
  };
  //播放
  doPlay = function(){
  if(play_status == false){
  bar.ball._x = 0;
  play_status = true;
  ns.play(flv);
  //播放进度条
  bar.onEnterFrame=function(){
  nc.call("getFileLength", new FileLength(), flv);
  var nowPlayPercent=Math.round(ns.time/streamLength*100);
  if(isNaN(nowPlayPercent)){
  bar.ball._x = 0;
  }
  else{
  bar.ball._x = nowPlayPercent*490/100;
  }
  if(nowPlayPercent==99){
  play_status = false;
  bar.ball._x = 0;
  bt_play._visible = true;
  bt_pause._visible = false;
  //ns.close();
  delete this.onEnterFrame;
  }
  };
  //缓冲提示
  var buffer_interval:Number = setInterval(checkBufferTime, 100, ns);
  }
  else{
  ns.pause();
  }
  };
  //暂停
  doPause = function(){
  ns.pause();
  };
  //停止
  doStop = function(){
  play_status = false;
  bar.ball._x = 0;
  //ns.seek(0);
  //ns.pause(true);
  ns.close();
  };
  //开始播放
  playNow.onRelease=function(){
  bt_play._visible = false;
  bt_pause._visible = true;
  doPlay();
  };
  //播放按钮
  bt_play.onRelease=function(){
  bt_play._visible = false;
  bt_pause._visible = true;
  doPlay();
  };
  //暂停按钮
  bt_pause.onRelease=function(){
  bt_play._visible = true;
  bt_pause._visible = false;
  doPause();
  };
  //停止按钮
  bt_stop.onRelease=function(){
  bt_play._visible = true;
  bt_pause._visible = false;