logo

实例详解stratus+flex+MySQL实现在线随机视频聊天室的功能

时间:2010-5-4 21:56:56 来源:www.cnblogs.com 作者:疯狂的八神庵

由于flashplayer已经开始支持p2p,所以说用Stratus搭建p2p环境如此简单,双方只需要能连上Stratus服务器就能直接进行语音视频的聊天,不需要任何客户端。

本文用Mysql和flex弄了个简易随机视频聊天室,和有共同爱好的各位一起分享下。

 下面正式开始,程序主体主要分为3大块:

一、p2p语音视频功能模块

 这个模块网上有很多教程了,Adobe官方的那个Sample就很好。我就是以此为基础进行开发的。可能有些朋友还不是很了解,为了每个人都能搞清楚,下面针对代码详细地进行下介绍。

由于是p2p模式,每个用户既是呼叫者又是被呼叫者。更具体点,举个例子有两个人A和B打电话。A呼叫B,此时A是呼叫者,B是被呼叫者。反之B是呼叫者,A是被呼叫者。因此在每个p2p模块中必须要有呼叫者和被呼叫者两个部分。

被呼叫部分:

Code [http://www.xueit.com]
//被呼叫者发布监听流,以便呼叫者连接 listenStream = new NetStream(netConnection,NetStream.DIRECT_CONNECTIONS); listenStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); listenStream.publish(username); //呼叫者一旦订阅上面的监听流,就会触发onPeerConnect事件 var c:Object =new Object(); c.onPeerConnect = function(caller:NetStream):Boolean { if(callState == CallReady) { //接受呼叫者发布的视频语音流 callState = CallRinging; idManager.change(callState); busyState = busyOn; incomingStream = new NetStream(netConnection,caller.farID); incomingStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); video =new Video(); video.attachNetStream(incomingStream); remoteVideoDisplay.addChild(video); incomingStream.play("caller"); var st:SoundTransform = new SoundTransform(speakerVolumeSlider.value); incomingStream.soundTransform = st; //处理呼叫的方法 var i:Object = new Object(); i.onIncomingCall = function(caller:String):void { if(callState != CallRinging) { txtInfo.text = "onIncomingCall: Wrong call state: " callState "\n"; return; } send_bn.enabled=true; txtInfo.text = caller "已经成功与您连接上\n"; partnername = caller; //outgoingStream.send("onCallAccepted", username); callState = CallEstablished; //idManager.change(callState); } i.onIm = function(caller:String,text:String):void { txtMessage.text = caller ": " text "\n"; } i.onDisconnected = function(caller:String):void { txtInfo.text = caller "和你断开连接\n"; send_bn.enabled=false; stop(); } incomingStream.client = i; //对呼叫者发布自己的语音视频流 outgoingStream = new NetStream(netConnection,NetStream.DIRECT_CONNECTIONS); outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,callee_outgoingStreamHandler); outgoingStream.attachCamera(camera); outgoingStream.attachAudio(mic); outgoingStream.publish("callee"); return true; } txtInfo.text = "onPeerConnect: all rejected due to state: " callState "\n"; return false; } listenStream.client = c; callState = CallReady; 呼叫部分: callState = CallCalling; idManager.change(callState); busyState = busyOn; //播放被呼叫者的监听流 controlStream = new NetStream(netConnection,farPeerID); controlStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); controlStream.play(partnername); //对被呼叫者发布自己的视频语音流 outgoingStream = new NetStream(netConnection,NetStream.DIRECT_CONNECTIONS); outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,caller_outgoingStreamHandler); outgoingStream.attachCamera(camera); outgoingStream.attachAudio(mic); outgoingStream.publish("caller"); txtInfo.text = "正在与" partnername "建立连接\n"; //播放被呼叫者的视频语音流 incomingStream = new NetStream(netConnection,farPeerID); incomingStream.addEventListener(NetStatusEvent.NET_STATUS,statusHandler); video =new Video(); video.attachNetStream(incomingStream); remoteVideoDisplay.addChild(video); incomingStream.play("callee"); var st:SoundTransform = new SoundTransform(speakerVolumeSlider.value); incomingStream.soundTransform = st; //处理呼叫的方法 var i:Object = new Object(); i.onIm = function(callee:String,text:String):void { txtMessage.text = callee ": " text "\n"; } i.onCallAccepted = function(callee:String):void { if (callState != CallCalling) { txtInfo.text = "连接失败"; return; } send_bn.enabled=true; txtInfo.text = callee "已经成功与您连接上\n"; callState = CallEstablished; //idManager.change(callState); } i.onDisconnected = function(callee:String):void { txtInfo.text = callee "和你断开连接\n"; send_bn.enabled=false; stop(); } incomingStream.client = i;


文章分页123
标签:
100%

回复:实例详解stratus+flex+MySQL实现在线随机视频聊天室的功能

0 / 5000