flex视频\声音录制及播放

va代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="312" width="328" creationComplete="init()">  
  3. <mx:Script>  
  4.  <![CDATA[  
  5.   //预定义声明  
  6.   import mx.controls.Alert;  
  7.   import mx.events.SliderEvent;  
  8.     
  9.   //创建一个基本的网络连接对象  
  10.   private var vi:Video;  
  11.   private var cam:Camera;      //定义一个摄像头  
  12.   private var inNs:NetStream;  
  13.   private var outNs:NetStream;   
  14.   private var nc:NetConnection;  
  15.   //private var mic:Microphone; //定义一个麦克风  
  16.    
  17.   private var _duration:Number;            //视频播放时间  
  18.   private var playPosition:Number;         //定义播放进度位置  
  19.   //private var soundPosition:Number;    //定义声音大小控制条的位置  
  20.   private var flag:Boolean = false;          
  21.   private var lastVideoName:String = "";   //视频录制后保存的名字  
  22.   private var _url:String = "rtmp://127.0.0.1:1935/videoRec";  
  23.     
  24.   public function init():void{  
  25.    setupCamera();    //初始化摄像头信息  
  26.   }  
  27.   //开始录制按扭点击  
  28.   public function clickConnect():void{  
  29.     nc = new NetConnection();  
  30.     nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);  
  31.              nc.connect(_url);         //连接red5服务器  
  32.   }    
  33.   public function nsHandler(evt:NetStatusEvent):void{  
  34.    if (evt.info.code == "NetConnection.Connect.Success"){           //如果连接成功  
  35.     playClick();  
  36.     }else{  
  37.      Alert.show("连接失败");      
  38.     }      
  39.   }  
  40.   //开始录制  
  41.   public function playClick():void{     
  42.    if(vi != null){  
  43.     vi.clear();  
  44.     vdisplay.removeChild(vi);  
  45.     vi = new Video();  
  46.     vi.width = 320;  
  47.     vi.height = 240;  
  48.     vi.attachCamera(cam);  
  49.        vdisplay.addChild(vi);  
  50.    }  
  51.    outNs = new NetStream(nc);         
  52.    outNs.attachCamera(cam);   //把摄像头存入outNs  
  53.    //outNs.attachAudio(mic);          //把麦克风存入outNs  
  54.    lastVideoName = "red5RecordDemo_" + Math.random()+getTimer();  
  55.    outNs.publish(lastVideoName, "record");  
  56.         
  57.    startRec.enabled = false;  
  58.    stopRec.enabled = true;     
  59.   }    
  60.   //停止录制  
  61.   public function stopClick():void{  
  62.    //关闭ns与red5的连接  
  63.    outNs.close();   
  64.    vi.clear();  
  65.    vdisplay.removeChild(vi);    
  66.    //锁定开始按键使其生效  
  67.    startRec.enabled = true;  
  68.    //锁定停止按键使其失效  
  69.    stopRec.enabled = false;  
  70.   }    
  71.   //录制完以后播放  
  72.   public function playLastVideo():void{  
  73.      if(nc!=null){  
  74.       //addEventListener(Event.ENTER_FRAME,onEnterFrame);  
  75.        inNs = new NetStream(nc);  
  76.     //定义onMetaData,获取视频相关数据  
  77.     var customClient:Object = new Object();  
  78.     customClient.onMetaData = function(metadata:Object):void{  
  79.      _duration = metadata.duration; //获取视频持续时间  
  80.      t_sh.maximum = _duration;  
  81.     }  
  82.     inNs.client = customClient;  
  83.     //删除原_localVideo,便于在录制和播放视频之间切换  
  84.     vi = new Video();  
  85.     vi.width = 320;  
  86.     vi.height = 240;  
  87.     vi.attachNetStream(inNs);  
  88.     vdisplay.addChild(vi);   
  89.     inNs.play(lastVideoName+".flv");  
  90.     addEventListener(Event.ENTER_FRAME,onEnterFrame);   
  91.      }  
  92.   }  
  93.     
  94.   //初始化摄像头  
  95.   public function setupCamera():void{  
  96.    //启动摄像头  
  97.    cam = Camera.getCamera();   
  98.    if(cam != null){  
  99.     cam.addEventListener(StatusEvent.STATUS,onStatusHandler);  
  100.     cam.setMode(320,240,30);  
  101.     cam.setQuality(0,70);  //设置清晰度  
  102.     vi = new Video();  
  103.     vi.width = 320;  
  104.     vi.height = 240;  
  105.     vi.attachCamera(cam);  
  106.     vdisplay.addChild(vi);  
  107.   
  108.    }  
  109. //   mic = Microphone.getMicrophone();  
  110. //   if(mic != null){  
  111. //    mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据  
  112. //    mic.gain = 80; //设置麦克风声音大小  
  113. //   }  
  114.   }  
  115.     
  116.   private function onStatusHandler(event:StatusEvent):void{  
  117.    if(!cam.muted){   //判断摄像头存不存在  
  118.     startRec.enabled = true;  
  119.    }else{  
  120.     Alert.show("错误:无法链接到活动摄像头!")  
  121.    }  
  122.    cam.removeEventListener(StatusEvent.STATUS,onStatusHandler);  
  123.   }  
  124.     
  125.   public function thumbPress(event:SliderEvent):void{  
  126.       inNs.togglePause();  
  127.    removeEventListener(Event.ENTER_FRAME,onEnterFrame);  
  128.   }  
  129.   private function thumbChanges(event:SliderEvent):void{  
  130.     playPosition = t_sh.value;        //当前播放视频进度的位置=当前播放进度条的位置  
  131.     inNs.seek(playPosition);   
  132.     addEventListener(Event.ENTER_FRAME,onEnterFrame);  
  133.   }  
  134.   private function thumbRelease(event:SliderEvent):void{      //释放mouse后执行  
  135.    inNs.seek(playPosition);                             //查找当前进度条位置  
  136.    inNs.togglePause();  
  137.       addEventListener(Event.ENTER_FRAME,onEnterFrame);  
  138.   }  
  139.   public function onEnterFrame(event:Event):void{  
  140.    if(_duration > 0 && inNs.time > 0){ //如果视频时间和正在播放视频的时间大于0  
  141.     t_sh.value =inNs.time;  
  142.     lbtime.text = formatTimes(inNs.time) + " / "+ formatTimes(_duration);  
  143.    }     
  144.    if(formatTimes(inNs.time)==formatTimes(_duration)){    //如果播放完毕,则关毕流,初始化摆放时间的label  
  145.       if(flag==true){        //如果是加载,就不执行 ||false代表是加载,true代表是播放结束  
  146.      removeEventListener(Event.ENTER_FRAME,onEnterFrame);  
  147.      inNs.close();      
  148.      lbtime.text = "0:00 / "+ formatTimes(_duration);  
  149.     }  
  150.        setTimeout(function():void{flag = true;},1000);  
  151.    }  
  152.    }  
  153.   //时间格式操作  
  154.   private function formatTimes(value:int):String{  
  155.    var result:String = (value % 60).toString();  
  156.    if (result.length == 1){  
  157.     result = Math.floor(value / 60).toString() + ":0" + result;  
  158.    } else {  
  159.     result = Math.floor(value / 60).toString() + ":" + result;  
  160.    }  
  161.    return result;  
  162.   }    
  163.   //声音音量控制  
  164. //  private function sound_thumbChanges(event:SliderEvent):void{  
  165. //   soundPosition = th_sound.value;  
  166. //  }  
  167. //  private function sound_thumbRelease(event:SliderEvent):void{  
  168. //   vdisplay.volume = soundPosition;  
  169. //  }  
  170.   
  171.  ]]>  
  172. </mx:Script>  
  173.  <mx:VideoDisplay x="0" y="0" width="324.5" height="240" id="vdisplay"/>  
  174.  <mx:Button x="10" y="250" label="开始录制" id="startRec" click="clickConnect()" enabled="false" />  
  175.  <mx:Button x="10" y="280" label="停止录制" width="70" id="stopRec" click="stopClick()" enabled="false" />  
  176.  <mx:Button x="253" y="268" label="播放" click="playLastVideo()"  />  
  177.  <mx:HSlider x="98" y="248" width="143" id="t_sh" thumbPress="thumbPress(event)" thumbRelease="thumbRelease(event)" change="thumbChanges(event)"/>  
  178.  <mx:Label x="237" y="242" text="0:00/0:00" width="89" textAlign="center" height="18" id="lbtime"/>  
  179.  <!--mx:HSlider x="98" y="278" width="91" id="th_sound" minimum="0" maximum="1" value="{vdisplay.volume}" change="sound_thumbChanges(event)" thumbRelease="sound_thumbRelease(event)"/>  
  180.  <mx:Label x="187" y="270" text="sound" height="20" width="44" textAlign="center"/-->   
  181. </mx:Application>  
  182.   
  183. 注:  
  184.   
  185. 1.red5做服务器,后面代码其实什么也没有,最关键的还是前端flex代码,当然还有些配置问题,相信做过red5  simple   demo的朋友应该知道,在这就不一一细说了.  
  186.   
  187. 2.文章中注释地方是音频的录制,因为本机上无麦克风所以就屏掉了。如果要加上些功能,去掉注释即可。  
  188.   
  189. 3.以下是前端显示图  




  • 描述: 前端显示图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值