flex摄像头联接视频录制
flex摄像头连接视频录制Flex提供了3个类实现与服务器端的通信:HTTPService,ReObject和WebService。另外,我
flex摄像头连接视频录制
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
- <?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.以下是前端显示图??
-