基于red5的flex视频研究(2)

本文分享了使用Red5服务器进行视频聊天应用开发的经验,详细介绍了上下线提醒功能的实现及遇到的问题解决方法,并探讨了视频请求交互机制,包括如何处理客户端与服务器间的数据传递等问题。
这两天又完善了下细节性的东西,包括上下线提醒,视频请求交互……本以为很容易的,但是做的过程中还是发现了许多问题,同时也有一些疑问,在此和大家分享一下。
上下线提醒:
当有用户进入的时候,服务器端的方法appConnect()自动执行,可以在此方法中加入向其它在线的用户广播上线的方法.在遍历所有在线用户时,我开始用的是:

Iterator<IConnection> it = scope.getConnections();

可是myEclipse报错,按照错误说明是scope.getConnections()应该返回的是Collection<set<IConnection>>类型,我网上查了下,都是像我上面那样用,也没出现上面错误啊,我又查了下red5API中的IScope中的getConnections()方法,返回的的确是IConnection类型啊,这把我郁闷了,难道是red5版本的问题,导致red5.jar包中某些类中方法改变啦,我用的是red5 0.9.没办法,我只得按照不报错来,就换成下面的:

Iterator it = scope.getConnections().iterator();
while(it.hasNext()){
Set connections = (Set)it.next();
IConnection conn = (IConnection)connections.iterator ().next();
callClientLogin(conn,name); //此方法将调用客户端上线提醒方法
}

这下就不报错了,测试了下,也成功了!也不知道怎么回事?没有去看官方版本改进说明,有哪位童鞋知道的麻烦留个言告诉一下,3Q!!
视频请求交互:
实现机制很简单,无非首先得到请求视频对象的IConnection,然后调用客户端方法,被邀请方同意视频请求后,然后再取得邀请方的IConnection,调用客户端取得被邀请方视频的方法,同时被邀请方调用取得邀请方视频的方法。但是这里面很容易出问题,因为参数在客户端和服务器端来回传递,思路一定要清晰,另外我刚开始也遇到了问题,被邀请方能看到邀请方的视频,但是邀请方看不到被邀请方的,参数我是传了的,我打印了下传到服务器端的对象,结果显示null,也就是说参数没保存信息,最后我将被邀请方和邀请方的信息保存在数组里面,这样就好使了。

//客户端:
//邀请他人视频
private function inviteVideo():void{
var To:String = userList.selectedItem.username;
videoUsers[1] = To;
chatCon.htmlText += "您选择的对象是:"+ To;
nc.call("videoInvite",null,videoUsers[0],videoUsers[1]);
Alert.show("正在等待对方连 接...","haha",Alert.CANCEL,this,canelHander);
}

//视频请求交互
public function IsVideoInvite(from:String):void{
Alert.show(from+"邀请你视频,是否同意?","是吗",Alert.YES|Alert.NO,this,alertClientHander);
}

//被邀请方同意视频
private function alertClientHander(event:CloseEvent):void{
if(event.detail==Alert.YES){
nc.call("videoInviteSuccess",null,videoUsers[0]);
}
getVideo();
else{
}
}
//获取邀请方视频
private function getVideo():void{
remoteStream = new NetStream(nc);
remoteStream.bufferTime=1; //缓冲1秒再播放,保证视频流畅
otherVideo.width=remoteVideo.width; otherVideo.height=remoteVideo.height;
otherVideo.attachNetStream(remoteStream);
remoteStream.play(userName);
remoteVideo.addChild(otherVideo);
}
//邀请方获取被邀请方视频
private function getOtherVideo(user:String):void{
remoteStream = new NetStream(nc);
remoteStream.bufferTime=1; //缓冲1秒再播放,保证视频流畅
otherVideo.width=remoteVideo.width; otherVideo.height=remoteVideo.height;
otherVideo.attachNetStream(remoteStream);
remoteStream.play(user);
remoteVideo.addChild(otherVideo);
}


另外还要指出一点,可能大家做的时候会发现相互获取视频的时候调用的方法实现都差不多,我也试着让二者调用同一方法,无非让传参不同,结果没能得到想要结果,因为这个时候会出现异步错误,大家可以增加个监听器看看就知道了

.......
nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler);
.......
//异步错误
private function _asyncHandler(evt:AsyncErrorEvent) {
chatCon.htmlText += "异步错误!\n";
}


待续...
接下来将研究下flex动态生成组件问题,每当有人向你请求视频时,动态生成视频窗口,这样会出现多个其它人的视频。
主要为了测试下服务器的带宽消耗,看看red5能支持多少路视频音频流,清晰度,延迟怎样?远程共享白板要放一放了....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值