• FLEX入门实例——结合FMS3在线录制FLV视频


    以前一直以为录制视频是一件很麻烦的事情,这两天忙中偷闲研究了下FMS,没想到利用FMS和FLEX一切来得这么简单,刚研究这DD,一些内部机制都没能理解得很通透,如果那里说得不够准确或有误,欢迎大家拍砖,先说说它的原理:FLEX利用RTMP协议来与FMS也就是服务端取得连接,RTMP与HTTP的最大不同之处在于,RTMP是一个有状态的协议,它不仅可以一直与客户端保持连接,而且可以监控客户端的行为并主动与之交互,而HTTP则是一个无状态的协议,当客户端主动发出请求,服务端响应完毕后,一次会话过程序就结束了.而在FLEX中,主要用到了NetConnection和NetStream类,有过编程经验的朋友一眼就能看出来这两个家伙是干嘛的吧.小弟就不多说了.
     
    先看代码吧:想表达的在注释中:
     
    Java代码 
    <?xml version="1.0" encoding="utf-8"?>   
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp();">   
    <mx:Script>   
    <![CDATA[   
    import mx.messaging.errors.NoChannelAvailableError;   
    private var nc:NetConnection;   
    private var ns:NetStream;   
    private var rtmpNow:String;   
    private var msg:Boolean;   
    private var metaSniffer:Object;   
    private var dur:Number;   
    private var cam:Camera;   
    private var mic:Microphone;   
    private var vid1:Video;   
      
    private function initApp():void{   
    //初始化一个网络连接   
    nc=new NetConnection();   
    //为这个连接添加事件,这个事件有返回连接状态   
    nc.addEventListener(NetStatusEvent.NET_STATUS,checkConnect);   
    //这是连接的地址其实就是在你FMS的安装目录里,Applications下新建一个vid2的文件夹,这个文件夹可以看成是你的工程名了   
    //至于后面的recordings是你录制视频时存放视频的文件夹   
    rtmpNow="rtmp://localhost/vid2/recordings";   
    //开始连接   
    nc.connect(rtmpNow);   
    addMedia();   
    }   
      
    private function checkConnect(event:NetStatusEvent):void{   
    //根据连接返回的状态信息判断是滞连接成功   
    msg=(event.info.code=="NetConnection.Connect.Success");   
    msgError.text=event.info.code;   
    if(msg){   
    //如果成功,就利用些连接建立一个流,为以后的录制传输数据   
    ns=new NetStream(nc);   
    msgError.text="establish netStream";   
    }   
    }   
      
    private function startRecord(e:Event):void{   
    if(ns){   
      
    msgError.text="start record";   
    //开始录制时要加载micphone和摄像头   
    ns.attachAudio(mic);   
    ns.attachCamera(cam);   
    //这里是关键,从这里开始,就开始录制了,input.text是录制的视频文件的名称   
    ns.publish(input.text,"record");   
    }   
    }   
      
    private function stop(event:Event):void{   
    //和JAVA里类似,流类的东西一定要记得关闭   
    ns.play(false);   
    ns.close();   
    msgError.text="stop";   
    }   
      
    private function addMedia ():void   
    {   
    //获取系统的摄像头   
    cam=Camera.getCamera();   
    //设定宽,高,以及帧   
    cam.setMode (240,180,24);   
    //设定画面质量   
    cam.setQuality (0,90);   
    //获取系统的microphone   
    mic=Microphone.getMicrophone();   
    //让videoDisplay加载摄像头   
    vv.attachCamera(cam);   
    msgError.text="initnize";   
    }   
      
      
    ]]>   
    </mx:Script>   
      
    <mx:VBox id="myVb">   
    <mx:VideoDisplay id="vv" width="400" height="300"/>   
    <mx:Button label="record" id="btn" click="startRecord(event);"/>   
    <mx:Button label="play" id="stopbtn" click="stop(event);"/>   
    <mx:TextInput id="input"/>   
    <mx:TextArea id="msgError" backgroundColor="red"/>   
    </mx:VBox>   
    </mx:Application>   
  • 相关阅读:
    Tutorial: Getting started with fuzzing The Go Programming Language https://go.dev/doc/tutorial/fuzz
    在Bash脚本中引入alias的问题
    因果推断:效应估计的常用方法及工具变量讨论 https://mp.weixin.qq.com/s/oNu3wim9mXGzW2D9eeq_CQ
    It is illegal to take the address of such an element; if s[i] is the i'th byte of a string, &s[i] is invalid.
    Go 高性能编程技法 知乎 https://zhuanlan.zhihu.com/p/482547957
    /etc/passwd
    /sbin/nologin
    Go 1.18 is released!
    树形表格
    nginx 静态文件 文件乱码
  • 原文地址:https://www.cnblogs.com/top5/p/1649980.html
Copyright © 2020-2023  润新知