在好例子网,分享、交流、成长!
您当前所在位置:首页Flash 开发实例ActionScript语言基础 → 聊天室/多人视频会议系统源码 (Fms3和Flex开发)

聊天室/多人视频会议系统源码 (Fms3和Flex开发)

ActionScript语言基础

下载此实例
  • 开发语言:Flash
  • 实例大小:0.48M
  • 下载次数:30
  • 浏览次数:555
  • 发布时间:2014-03-26
  • 实例类别:ActionScript语言基础
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Flex 视频 聊天 FMS 会议

同类人气实例

实例介绍

【实例简介】

【实例截图】

【核心代码】

<?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>

实例下载地址

聊天室/多人视频会议系统源码 (Fms3和Flex开发)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警