zoukankan      html  css  js  c++  java
  • flex视频,声音录制及播放

    <?xml version="1.0" encoding="utf-8"?>  
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" height="312" width="328" creationComplete="init()">  
    <mx:Script>  
     <![CDATA[  
      //预定义声明  
      import mx.controls.Alert;  
      import mx.events.SliderEvent;  
        
      //创建一个基本的网络连接对象  
      private var vi:Video;  
      private var cam:Camera;      //定义一个摄像头  
      private var inNs:NetStream;  
      private var outNs:NetStream;   
      private var nc:NetConnection;  
      //private var mic:Microphone; //定义一个麦克风  
       
      private var _duration:Number;            //视频播放时间  
      private var playPosition:Number;         //定义播放进度位置  
      //private var soundPosition:Number;    //定义声音大小控制条的位置  
      private var flag:Boolean = false;          
      private var lastVideoName:String = "";   //视频录制后保存的名字  
      private var _url:String = "rtmp://127.0.0.1:1935/videoRec";  
        
      public function init():void{  
       setupCamera();    //初始化摄像头信息  
      }  
      //开始录制按扭点击  
      public function clickConnect():void{  
        nc = new NetConnection();  
        nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);  
                 nc.connect(_url);         //连接red5服务器  
      }    
      public function nsHandler(evt:NetStatusEvent):void{  
       if (evt.info.code == "NetConnection.Connect.Success"){           //如果连接成功  
        playClick();  
        }else{  
         Alert.show("连接失败");      
        }      
      }  
      //开始录制  
      public function playClick():void{     
       if(vi != null){  
        vi.clear();  
        vdisplay.removeChild(vi);  
        vi = new Video();  
        vi.width = 320;  
        vi.height = 240;  
        vi.attachCamera(cam);  
           vdisplay.addChild(vi);  
       }  
       outNs = new NetStream(nc);         
       outNs.attachCamera(cam);   //把摄像头存入outNs  
       //outNs.attachAudio(mic);          //把麦克风存入outNs  
       lastVideoName = "red5RecordDemo_" + Math.random()+getTimer();  
       outNs.publish(lastVideoName, "record");  
            
       startRec.enabled = false;  
       stopRec.enabled = true;     
      }    
      //停止录制  
      public function stopClick():void{  
       //关闭ns与red5的连接  
       outNs.close();   
       vi.clear();  
       vdisplay.removeChild(vi);    
       //锁定开始按键使其生效  
       startRec.enabled = true;  
       //锁定停止按键使其失效  
       stopRec.enabled = false;  
      }    
      //录制完以后播放  
      public function playLastVideo():void{  
         if(nc!=null){  
          //addEventListener(Event.ENTER_FRAME,onEnterFrame);  
           inNs = new NetStream(nc);  
        //定义onMetaData,获取视频相关数据  
        var customClient:Object = new Object();  
        customClient.onMetaData = function(metadata:Object):void{  
         _duration = metadata.duration; //获取视频持续时间  
         t_sh.maximum = _duration;  
        }  
        inNs.client = customClient;  
        //删除原_localVideo,便于在录制和播放视频之间切换  
        vi = new Video();  
        vi.width = 320;  
        vi.height = 240;  
        vi.attachNetStream(inNs);  
        vdisplay.addChild(vi);   
        inNs.play(lastVideoName+".flv");  
        addEventListener(Event.ENTER_FRAME,onEnterFrame);   
         }  
      }  
        
      //初始化摄像头  
      public function setupCamera():void{  
       //启动摄像头  
       cam = Camera.getCamera();   
       if(cam != null){  
        cam.addEventListener(StatusEvent.STATUS,onStatusHandler);  
        cam.setMode(320,240,30);  
        cam.setQuality(0,70);  //设置清晰度  
        vi = new Video();  
        vi.width = 320;  
        vi.height = 240;  
        vi.attachCamera(cam);  
        vdisplay.addChild(vi);  
      
       }  
    //   mic = Microphone.getMicrophone();  
    //   if(mic != null){  
    //    mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据  
    //    mic.gain = 80; //设置麦克风声音大小  
    //   }  
      }  
        
      private function onStatusHandler(event:StatusEvent):void{  
       if(!cam.muted){   //判断摄像头存不存在  
        startRec.enabled = true;  
       }else{  
        Alert.show("错误:无法链接到活动摄像头!")  
       }  
       cam.removeEventListener(StatusEvent.STATUS,onStatusHandler);  
      }  
        
      public function thumbPress(event:SliderEvent):void{  
          inNs.togglePause();  
       removeEventListener(Event.ENTER_FRAME,onEnterFrame);  
      }  
      private function thumbChanges(event:SliderEvent):void{  
        playPosition = t_sh.value;        //当前播放视频进度的位置=当前播放进度条的位置  
        inNs.seek(playPosition);   
        addEventListener(Event.ENTER_FRAME,onEnterFrame);  
      }  
      private function thumbRelease(event:SliderEvent):void{      //释放mouse后执行  
       inNs.seek(playPosition);                             //查找当前进度条位置  
       inNs.togglePause();  
          addEventListener(Event.ENTER_FRAME,onEnterFrame);  
      }  
      public function onEnterFrame(event:Event):void{  
       if(_duration > 0 && inNs.time > 0){ //如果视频时间和正在播放视频的时间大于0  
        t_sh.value =inNs.time;  
        lbtime.text = formatTimes(inNs.time) + " / "+ formatTimes(_duration);  
       }     
       if(formatTimes(inNs.time)==formatTimes(_duration)){    //如果播放完毕,则关毕流,初始化摆放时间的label  
          if(flag==true){        //如果是加载,就不执行 ||false代表是加载,true代表是播放结束  
         removeEventListener(Event.ENTER_FRAME,onEnterFrame);  
         inNs.close();      
         lbtime.text = "0:00 / "+ formatTimes(_duration);  
        }  
           setTimeout(function():void{flag = true;},1000);  
       }  
       }  
      //时间格式操作  
      private function formatTimes(value:int):String{  
       var result:String = (value % 60).toString();  
       if (result.length == 1){  
        result = Math.floor(value / 60).toString() + ":0" + result;  
       } else {  
        result = Math.floor(value / 60).toString() + ":" + result;  
       }  
       return result;  
      }    
      //声音音量控制  
    //  private function sound_thumbChanges(event:SliderEvent):void{  
    //   soundPosition = th_sound.value;  
    //  }  
    //  private function sound_thumbRelease(event:SliderEvent):void{  
    //   vdisplay.volume = soundPosition;  
    //  }  
      
     ]]>  
    </mx:Script>  
     <mx:VideoDisplay x="0" y="0" width="324.5" height="240" id="vdisplay"/>  
     <mx:Button x="10" y="250" label="开始录制" id="startRec" click="clickConnect()" enabled="false" />  
     <mx:Button x="10" y="280" label="停止录制" width="70" id="stopRec" click="stopClick()" enabled="false" />  
     <mx:Button x="253" y="268" label="播放" click="playLastVideo()"  />  
     <mx:HSlider x="98" y="248" width="143" id="t_sh" thumbPress="thumbPress(event)" thumbRelease="thumbRelease(event)" change="thumbChanges(event)"/>  
     <mx:Label x="237" y="242" text="0:00/0:00" width="89" textAlign="center" height="18" id="lbtime"/>  
     <!--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)"/>  
     <mx:Label x="187" y="270" text="sound" height="20" width="44" textAlign="center"/-->   
    </mx:Application>  
      
    注:  
      
    1.red5做服务器,后面代码其实什么也没有,最关键的还是前端flex代码,当然还有些配置问题,相信做过red5  simple   demo的朋友应该知道,在这就不一一细说了.  
      
    2.文章中注释地方是音频的录制,因为本机上无麦克风所以就屏掉了。如果要加上些功能,去掉注释即可。  
      
    3.以下是前端显示图

     

  • 相关阅读:
    java url 获取文件_[转]从URL获取文件保存到本地的JAVA代码,url 请求设置http请求头
    解决Mybatis中出现的Invalid bound statement (not found)问题
    使用多线程往LIST添加数据 线程安全list
    spring BeanUtils 工具实现对象之间的copy 属性复制,属性拷贝
    idea 打开Service窗口一个管理所有服务的地方
    java实现大文件下载(http方式)
    Java @Override注解写与不写的区别
    Linux下C++共享内存
    Linux配置开机自启
    Linux中zsh出现 zsh: corrupt history file /XXX/.zsh_history解决办法
  • 原文地址:https://www.cnblogs.com/top5/p/1649978.html
Copyright © 2011-2022 走看看