`
wangleifire
  • 浏览: 510881 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

flex 在线录制视频语音

    博客分类:
  • 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://localhost/oflaDemo";
 
  public function init():void{
   setupCamera();    //初始化摄像头信息
  }
  //开始录制按扭点击
  public function clickConnect():void{
    nc = new NetConnection();
    nc.client = this ;
    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 onBWDone():void {
        }
 
  //初始化摄像头
  public function setupCamera():void{
   //启动摄像头
   cam = Camera.getCamera();
   if(cam != null){
    cam.addEventListener(StatusEvent.STATUS,onStatusHandler);
    cam.addEventListener(ActivityEvent.ACTIVITY,onActiveHandler);
    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 onActiveHandler(event:ActivityEvent):void
  {
         if(!cam.muted){   //判断摄像头存不存在
            startRec.enabled = true;
       }else{
        Alert.show("错误:无法链接到活动摄像头!")
       }
       cam.removeEventListener(StatusEvent.STATUS,onStatusHandler);
  }
 
  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>

分享到:
评论

相关推荐

    Flex视频语音文字聊天程序

    ### Flex视频语音文字聊天程序详解 #### 知识点一:FlexBuilder与视频语音文字聊天程序 FlexBuilder是Adobe公司推出的一款专为Flex框架设计的集成开发环境(IDE),它支持ActionScript和MXML,是开发富互联网应用...

    Flex+Red5+Tomcat视频语音录制、播放

    Flex Red5 Tomcat 视频语音录制和播放 在网上找,总发现文章都一样,而且都是不完整的, 这里希望能够给跟我一样学习中的朋友一些帮助, 详细说明在压缩文件中有。 Flex+Red5+Tomcat视频播放器: ...

    非常不错的Flex播放器

    通过Microphone对象,开发者可以创建各种与声音相关的应用,例如语音聊天、在线录音或音频处理程序。在Flex中,使用Microphone类可以非常方便地获取和处理音频流,无需将音频数据发送到服务器,这在某些情况下提高了...

    基于flex,red5,java的一个聊天程序(含私聊)

    在聊天应用中,Red5可能用于处理音视频流,支持实时音频和视频通信,使得用户之间不仅可以文字交流,还能进行语音或视频通话。此外,它也支持私聊模式,即一对一的音视频通信。 3. **Java**: Java作为后端语言,...

    网站技术简介

    其中,在线视频语音聊天功能尤其值得一提,它突破了传统文本聊天的局限,让用户能够以更直观的方式进行交流,大大提升了网站的社交属性。 总之,VideoShare通过集成Flex3、BlazeDS、Spring2.5、Hibernate3.2、MySQL...

    openfire red5插件 sparkweb源码

    Red5是一个开源的流媒体服务器,能够处理音视频流,支持录制、播放、直播等功能。Red5基于Java开发,与Openfire结合,可以实现丰富的多媒体通信,如视频聊天。 SparkWeb是基于Openfire的一个Web客户端,它使用Flex...

    FMS案例开发[整理].pdf

    此外,案例开发还包括了如何创建可交互的FMS连接、基于FMS的流媒体播放程序、在线视频录制与回放以及如何利用远程共享对象实现多人实时在线聊天的详细步骤。这些系列文章深入浅出地讲解了从零开始构建这样一个系统的...

    selfservicekiosk-audio-streaming:使用websocket将音频从浏览器麦克风流传输到Dialogflow或Google Cloud STT的最佳实践

    在此演示中,您可以开始录制语音,它将在屏幕上显示答案并合成语音。 现场演示 可以在此处找到有效的演示: : 博客文章 我写了很多有关如何设置流式传输项目的博客文章。 是否想确切了解此代码的工作原理? 从这里...

    常见手机零配件及电子产品中英文对照.doc

    20. **Back Camera**:后置摄像头,主要用于拍摄照片和录制视频。 21. **Speaker / Loud Speaker**:喇叭,播放音频输出。 22. **Earpiece speaker**:听筒,将声音传送到用户耳朵。 23. **Microphone**:麦克风...

    造福特殊人群,手语发声机设计分享-电路方案

    这款手语发声机使用了Arduino主控器,结合5根flex4.5”单向弯曲传感器来识别手指姿态,通过DFPlayer Mini 播放器模块播放识别的语音,聋哑人借助该手语发声机,可以将手语表达转换成我们正常人可以听懂的语言,在...

Global site tag (gtag.js) - Google Analytics