浏览 6422 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-12
以前一直以为录制视频是一件很麻烦的事情,这两天忙中偷闲研究了下FMS,没想到利用FMS和FLEX一切来得这么简单,刚研究这DD,一些内部机制都没能理解得很通透,如果那里说得不够准确或有误,欢迎大家拍砖,先说说它的原理:FLEX利用RTMP协议来与FMS也就是服务端取得连接,RTMP与HTTP的最大不同之处在于,RTMP是一个有状态的协议,它不仅可以一直与客户端保持连接,而且可以监控客户端的行为并主动与之交互,而HTTP则是一个无状态的协议,当客户端主动发出请求,服务端响应完毕后,一次会话过程序就结束了.而在FLEX中,主要用到了NetConnection和NetStream类,有过编程经验的朋友一眼就能看出来这两个家伙是干嘛的吧.小弟就不多说了.
先看代码吧:想表达的在注释中:
<?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>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-17
写得很不错,有时间试试
|
|
返回顶楼 | |
发表时间:2008-07-06
您好:
看了您的代码感觉受益匪浅,可惜还自己太菜,不知道服务端是如何配置的,可不可以把服务端的配置一并贴出来啊! 不甚感激 |
|
返回顶楼 | |
发表时间:2008-07-06
我在这里使用的是FMS3做为服务器,这安装我就不多说了,我想都会的.我在上面用到的RTMP服务地址为rtmp://localhost/vid2/recordings
所以需要先到FMS的安装目标下找到Applications并在其目标下,新建一个vid2的文件夹,这个其实就是你的项目或工程名以及目录了, 后面的recordings会在发布视频时自动生成,不需要新建.经过这一步,服务器端的配置应该就基本OK了,接下来,进入到安装目标下的TOOLS目录点击StartServerService.bat批处理文件,启动服务器,然后,再启动你的FLEX或AIR项目,就可以测试了.如果不清楚,再与我交流.OK? 不知道我说清楚了没有. |
|
返回顶楼 | |
发表时间:2008-08-12
我按你的代码测试,红色TextArea中提示NetConnection.Connect.Closed
不知道问题出在哪里? |
|
返回顶楼 | |
发表时间:2008-08-31
LZ的文章是借鉴《learning flash media server 3》的吧,我看你定音了Video对象也没用。哈哈
|
|
返回顶楼 | |