`
kaka-pan
  • 浏览: 25655 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

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

阅读更多
    这两天又完善了下细节性的东西,包括上下线提醒,视频请求交互……本以为很容易的,但是做的过程中还是发现了许多问题,同时也有一些疑问,在此和大家分享一下。
     上下线提醒:
     当有用户进入的时候,服务器端的方法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能支持多少路视频音频流,清晰度,延迟怎样?远程共享白板要放一放了....
分享到:
评论
2 楼 lotusk 2015-08-31  
大概能同时支持多少路呢,一台普通服务器??
1 楼 jason- 2012-03-29  
我同样做了一个这样的ONE TO ONE的视频聊天,但是遇到一个奇怪的问题。我用了两条流(NetStream) 一条send专门用于每个客户端发送自己的视频流,一个hava专门用于订阅别人的视频。在google浏览器中运行很正常,但是换在火狐或者IE中问题就来了:A方请求视频,然后B方同意,但是这个时候却只能有一条流起作用,另外一条流明明是连同了的,但是就是不捕获本地视频,导致只能看见一边的图像,请问你遇见过这样的问题没?

相关推荐

Global site tag (gtag.js) - Google Analytics