首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

flex摄像头联接视频录制

2013-01-05 
flex摄像头连接视频录制Flex提供了3个类实现与服务器端的通信:HTTPService,ReObject和WebService。另外,我

flex摄像头连接视频录制

  1. Flex提供了3个类实现与服务器端的通信:HTTPService,ReObject和WebService。另外,我们还可以根据外部中间插件来让Flex与服务器端进行通信,比如Blazeds(Lcds),Red5(FMS)流媒体服务器,PHPRPC。

    ?

    HTTPService类用于超文本传输协议(HTTP)实现与服务器的通信。Flex应用程序用GET或POST请求将数据发送到服务端,并处理该请求所返回的XML或字符串。使用这个HTTPService类,可以与PHP页,ColdFusion页,JSP页,Javaservlet,RubyonRails,以及MicrosoftASP页进行通信。

    ?

    RemoteObject类可以与服务器之间通过ActionScriptMessageFormat(AMF)对象进行通信。通常来说,我们也可以把Blazeds与Lcds归于这一类。RemoteObject也可以与java或coldFusion远程网关进行通信,或者通过开源项目(例如AMFPHP.SabreAMF或WebORB)与.NET和PHP进行通信。

    ?

    关于Red5与FMS这两个流媒体服务器,应该说它们本身的优势在于多多媒体上,而实现Flex与服务器端相连,也是它们最基本的功能之一。

    WebService类与web服务进行通信,使用基于SOAP的XML或XML,web服务通过web服务描述语言(WSDL)定义其接口。

    ?

    本以为Blazeds会是个不错的选择,但是发现它对于流媒体的传送有点,让我不知道该怎么下手。虽说这个与java ee项目的直接访问,一开始让我很激动。

    ?

    后来发现通过类似red5这种流媒体服务器,或许是可行的。比较有名的是FMS,Red5等,Red5是一个开源的项目,和FMS在功能上其实是类似的。所以后来还是用了他,不过对于它的搭建还是废了点劲的。

    ?

    http://blog.csdn.net/zlxluofeng/article/details/5639446这个是找到的配置以及helloworld的例子。

    red5启动起来后,在浏览器中输入http://localhost:5080/来访问Red5发布的网页,然后找到Demo,选择一个Demo进入,在Demo的链接地址处输入rtmp://localhost/服务器项目名,点击链接按钮,如果后天的“5”编程了绿色,说明链接成功了,如果没有反应,那就检查一下哪个地方是否设错了。

    这篇是flex视频录制与播放,目前正在看这篇:http://www.iteye.com/topic/231569

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




  • flex摄像头联接视频录制

热点排行