基本信息
源码名称:聊天室/多人视频会议系统源码 (Fms3和Flex开发)
源码大小:0.48M
文件格式:.rar
开发语言:Flash
更新时间:2014-03-26
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" > <mx:Script> <![CDATA[ import mx.events.FlexEvent; [Bindable] public var userListData:ArrayCollection = new ArrayCollection(); import Bll.Message; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.controls.Label; private var talk_so:SharedObject; private var netConnection:NetConnection; private var outNetStream:NetStream; private var camera:Camera; private var microphone:Microphone; private var responder:Responder; private var appServer:String="rtmp://192.168.0.249/test_video3"; private var username:String=""; private function init(evt:MouseEvent):void { var str:String=this.txt_username.text; if ( str== "" || str=="输入你的名字" ) { Alert.show("进入聊天室前请输入你的英文名字"); return; } netConnection = new NetConnection(); netConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); netConnection.connect(appServer); netConnection.client=this; } private function initMedia():void { outNetStream = new NetStream(netConnection); camera = Camera.getCamera(); if ( camera == null ) { if ( Camera.names.length > 0 ) { Alert.show( "摄像头被其他程序占用"); } else { Alert.show( "系统没有检测到摄像头,建议您安装摄像头"); } } else { camera.setMode(120,90,15); camera.setQuality(0,90); //camera.addEventListener(StatusEvent.STATUS,statusCamera); outNetStream.attachCamera(camera); } microphone=Microphone.getMicrophone(); if ( microphone==null ) { if ( Microphone.names.length > 0 ) { Alert.show( "麦克风被其他程序占用"); } else { Alert.show( "系统没有检测到麦克风,建议您安装麦克风"); } } else { outNetStream.attachAudio(microphone); } if ( camera ) { outNetStream.publish(txt_username.text,"live"); vd_myVideo.attachCamera(camera); } else { outNetStream.close(); outNetStream=null; } } private function netStatusHandler(evt:NetStatusEvent):void { trace(evt.info.code); var info:Object = evt.info; switch(info.code) { case "NetConnection.Connect.Success": this.txt_content.addEventListener(FlexEvent.VALUE_COMMIT,VALUE_COMMITHandler); this.txt_message.addEventListener(KeyboardEvent.KEY_DOWN,sendKeyHandler); initMedia(); startCommunicate(); talk_so = SharedObject.getRemote("talk",netConnection.uri,true); talk_so.addEventListener(SyncEvent.SYNC,talkSoSyncHandler); talk_so.connect(netConnection); break; case "NetConnection.Connect.Rejected": Alert.show("fms连接被拒绝" info.code); break; case "NetConnection.Connect.Failed": Alert.show("fms连接失败" evt.info.code); break; case "NetConnection.Connect.Closed": Alert.show("fms连接已经关闭" evt.info.code); break; } } private function talkSoSyncHandler(evt:SyncEvent):void { txt_content.text=""; if ( talk_so.data.msgList!=null ) { var tmp:ArrayCollection = new ArrayCollection(); convertArrayCollection(tmp,talk_so.data.msgList as ArrayCollection); for(var i:int=0;i<tmp.length ;i ) { var message:Object = tmp.getItemAt(i); var time:Date= message.time; var dd:String = time.getFullYear().toString() "-" (time.getMonth() 1).toString() "-" time.getDate().toString() " " time.getHours().toString() ":" time.getMinutes().toString() ":" time.getSeconds().toString(); var fullMsg:String=message.nickname "在" dd "说:" message.msg; txt_content.text=txt_content.text "\n" fullMsg; } } } private function VALUE_COMMITHandler(evt:FlexEvent):void{ txt_content.verticalScrollPosition = txt_content.maxVerticalScrollPosition; } private function startCommunicate():void { username=txt_username.text; responder=new Responder(communicateStataHandler); netConnection.call("communicateServer",responder,username); } private function communicateStataHandler(str:String):void { //outMyVideo(); btn_start.enabled=false; txt_nickname.text=txt_username.text; btn_send.enabled=true; } private function outMyVideo():void { /* 发布视频 */ outNetStream = new NetStream(netConnection); outNetStream.attachCamera(camera); outNetStream.attachAudio(microphone); outNetStream.publish(username,"live"); } public function showServerMsg(msg:String):void { Alert.show(msg); } private function sendKeyHandler(evt:KeyboardEvent):void { if(evt.keyCode == 13) { this.sendTxt(); } } private function btnSenClickHandler(evt:MouseEvent):void { this.sendTxt(); } private function sendTxt():void { if ( txt_message.text=="" || txt_message.text=="请输入发言内容" ) { Alert.show("请输入发言内容"); return; } var arr:ArrayCollection = new ArrayCollection(); if ( talk_so.data.msgList==null ) { arr = new ArrayCollection(); } else { convertArrayCollection(arr,talk_so.data.msgList as ArrayCollection); } var obj:Message = new Message(); obj.nickname=txt_nickname.text; obj.msg=txt_message.text; obj.time = new Date(); arr.addItem(obj); talk_so.setProperty("msgList",arr); txt_message.text=""; } private function convertArrayCollection(arrNew:ArrayCollection,arrOld:ArrayCollection):void { arrNew.removeAll(); for(var i:int=0;i<arrOld.length ;i ) { arrNew.addItemAt(arrOld.getItemAt(i),i); } } public function playOtherVideo(newUserList:Array):void { vb_otherVideo.removeAllChildren(); this.userListData.removeAll(); for(var i:int=0;i<newUserList.length;i ) { if ( newUserList[i]!= txt_username.text ) { var vd:VideoDisplay = new VideoDisplay(); var video:Video = new Video(); video.width=120; video.height=90; var inNetStream:NetStream= new NetStream(netConnection); video.attachNetStream(inNetStream); trace(newUserList[i]); inNetStream.play(newUserList[i]); var label:Label= new Label(); label.text=newUserList[i] "的画面"; vd.addChild(video); vd.width=120; vd.height=90; vb_otherVideo.addChild(label); vb_otherVideo.addChild(vd); } var obj:Object = new Object(); obj.label=newUserList[i]; obj.data = i; this.userListData.addItem(obj); } } /* <mx:Style> TextArea { dropShadowEnabled: true; } </mx:Style> 是为了给控件显示阴影效果 camera = Camera.getCamera(); if ( camera == null ) { if ( Camera.names.length > 0 ) { Alert.show( "摄像头被其他程序占用"); } else { Alert.show( "系统没有检测到摄像头,建议您安装摄像头"); } } 是为了检测摄像头的使用情况 你也可以用事件监听camera.addEventListener(StatusEvent.STATUS,statusCamera);来确定摄像头的状态调度 this.txt_content.addEventListener(FlexEvent.VALUE_COMMIT,VALUE_COMMITHandler); private function VALUE_COMMITHandler(evt:FlexEvent):void{ txt_content.verticalScrollPosition = txt_content.maxVerticalScrollPosition; } 这段代码是为了实现TextArea控件的滚动条始终保持在最下面,以方便用户查看聊天信息 this.txt_message.addEventListener(KeyboardEvent.KEY_DOWN,sendKeyHandler); private function sendKeyHandler(evt:KeyboardEvent):void { if(evt.keyCode == 13) { this.sendTxt(); } } 这段代码是实现在TextInput控件中回车就发言的事件 代码可能写得比较乱,功能还不完善 计划下步做以下事情的开发: 一对一聊天,包括私聊 聊天记录的保存和查询(我计划用Adobe AIR中自带的Sqlite数据库来实现,据网络一文章说qq的聊天记录也是保存在Sqlite中,不知道是否为真?) 关于sqlite的相关文章可以看 http://www.cnblogs.com/aierong/archive/2009/01/22/flex_Sqlite_1.html 聊天白板功能 本文的部分代码编写过程中参考了qq网友(SakuraMomoko)blog中的文章,这此表示感谢! */ ]]> </mx:Script> <mx:Style> Application { backgroundImage: Embed(source="assets/brushedmetal.jpg"); } ToolTip { backgroundColor: #000000; color: #cc0033; fontSize: 12; fontWeight: bold; } TextArea { dropShadowEnabled: true; } TextInput { dropShadowEnabled: true; } List { borderStyle: solid; borderThickness: 5; dropShadowEnabled: true; fontWeight: bold; cornerRadius: 20; } </mx:Style> <mx:Label x="10" y="99" text="你的画面"/> <mx:VideoDisplay x="10" y="127" width="120" height="90" id="vd_myVideo"/> <mx:TextInput x="10" y="10" text="输入你的名字" id="txt_username" width="120" focusIn="txt_username.text=''" toolTip="进入聊天室前请输入你的英文名字"/> <mx:Button x="10" y="42" label="进入聊天室" id="btn_start" width="120" click="init(event)"/> <mx:VBox x="10" y="225" width="120" id="vb_otherVideo"> </mx:VBox> <mx:TextArea showScrollTips="true" cornerRadius="5" editable="false" x="138" y="58" height="187" width="300" id="txt_content"/> <mx:TextInput x="138" y="253" width="62" id="txt_nickname"/> <mx:Label x="208" y="255" text="说"/> <mx:TextInput x="238" y="253" width="136" id="txt_message" text="请输入发言内容" focusIn="txt_message.text=''" toolTip="请输入发言内容,回车即可发言" /> <mx:Button x="382" y="253" label="发言" id="btn_send" width="57" enabled="false" click="btnSenClickHandler(event)"/> <mx:Label x="138" y="30" text="聊天区(成功登陆后,可以与其他人进行文章聊天)" width="301" id="lb"/> <mx:List x="446" y="56" id="userList" dataProvider="{userListData}" height="189" width="98"></mx:List> <mx:Label x="447" y="30" text="用户列表"/> </mx:Application>