Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

chamuska

Problema ao conectar com Red5 e Flex.

Recommended Posts

Pessoal, estou fazendo um sistema de videoconferencia para até 10 pessoas.

Durante os testes, cada vez que um usuario loga no sistema aparece na tela de todos os usuariso logados mais um campo de video com o video do usuario que logou por ultimo e isso funciona perfeitamente enquanto existem 3 usuarios logados no sistema, porem, quando exite uma quarta conexão, ou mais, parece que da algum problema na lista de usuarios conectados(essa lista é um array que vem do Red5) pois o nome dos novos usuarios aparecem repetidos e da outros tipos de problemas em relação aos nomes dos usuarios.

Mas, na tela do quarto usuario, aparece o video dos demais usuarios normalmente, sem nenhum erro.

 

Alguem por acaso sabe se o Red5 tem algum problema pra conectar muitos usuarios ou se é preciso configurar alguma coisa no Red5 para funcionar uma videoconferencia com mais de 3 pessoas ?!

 

Assim que eu chegar em casa posto os codigos, mas caso seja problema no Red5 ou caso alguem tenha passado pelo mesmo problema agradeço qualquer ajuda!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguem os códigos como eu havia prometido!

 

Parte do codigo que conecta o usuario com o Red5 depois de logar no sistema:

 

private function connect():void{
//conexao cliente servidor
if( nc != null ){						
	nc=null;						
}
if( nc == null ){
	nc=new NetConnection();
       nc.addEventListener( NetStatusEvent.NET_STATUS, netStatus );
       nc.addEventListener( AsyncErrorEvent.ASYNC_ERROR, asyncError )
       nc.connect( hostRed5, nome );
       nc.client=this;
	}
}

private function conectado():void{				
sharedObject=SharedObject.getRemote( "chat", nc.uri, true )
   sharedObject.addEventListener( SyncEvent.SYNC, OnSync );
   sharedObject.addEventListener( AsyncErrorEvent.ASYNC_ERROR, asyncError );
   sharedObject.connect( nc );
   sharedObject.client=this;
   // sharedObject vaiser usada depois para fazer o envio de msg do chat
}
private function asyncError( e:AsyncErrorEvent ):void
{
trace( e )
}
private function OnSync( e:SyncEvent ):void
{
trace( e )
}

private function netStatus( e:NetStatusEvent ):void
{
_labelStatus.text=e.info.code;
switch ( e.info.code )
{
 		case "NetConnection.Connect.Success":
   		statusConnection=true;
   		conectado();
   		// permite escolher a webcam
   		Security.showSettings(SecurityPanel.PRIVACY);
   		onLiveVideo();
   		onPlayVideo();
   	break;
 		case "NetConnection.Connect.Closed":
   		statusConnection=false
	break;
 		case "NetConnection.Connect.Rejected":
   		statusConnection=false
   	break;
}
}

 

 

Parte do codigo que publica o video do usuario no Red5 e exibe o video no usuario para ele poder ver o que esta sendo gravado:

private function onLiveVideo():void
{


if(isCam){				
	camConfig();	  		
 		ns1 = new NetStream( nc );			  
  	ns1.attachCamera(camera);

}else{
	_labelStatus.text += " - WebCam: OFF";
}

if(isMic){
	mic.gain = _slidesVolume.value;
	mic.setUseEchoSuppression(true);
  	mic.setSilenceLevel(0);
	ns1.attachAudio(mic);

	_slidesVolume.enabled = true;
}else{
	_labelStatus.text += " - Mic: OFF";	
}			

ns1.publish(this.id_usuario);			


nsMeuUsuario = new NetStream(nc);
nsMeuUsuario.bufferTime = 0.5;


var vid2:Video = new Video();
vid2.attachNetStream(nsMeuUsuario);

vid2.width =  160;
vid2.height = 120;

vdMinhaWebCam.addChild(vid2);

nsMeuUsuario.play(this.id_usuario);

textoCam.text = nome;	

}

 

Função no Flex que recebe do Red5 o array com os usuarios conectados. Essa função é chamada toda vez que alguem se conecta ou desconecta. No final ela chama e função para inserir o video na tela.

public function listaUsuarios( lista:Array ):void
{
var i:int;
var aux:int;

var listaAlteradaExit:int = 0;
var usuarioConectado:int = 0;
var usuarioNovo:int = 0;
var usuarioSaiu:int = 0;

var userNome:String;
   var userId:String;

   var userNome2:String;
   var userId2:String;
   var ListaUsuariosAux:Array = new Array()

   // ordena os usuarios pelo id
   lista.sortOn("USER_ID", Array.DESCENDING | Array.NUMERIC);
   datagridUsuarios.dataProvider=lista;
// limpa o array
this.UsuariosNovos.splice(0);		    

if(primeiraConexao == 0)
   {		    
    for(i = 0; i < lista.length; i++)
    {			    	
    	// pega o ID do usuario pelo nome
	    if(lista[0].USER_NOME.toString() == nome)
	    {			    	    	
			this.id_usuario = lista[0].USER_ID.toString();		
		}

 		userId = lista[i].USER_ID.toString();
   		userNome = lista[i].USER_NOME.toString();
   		if(userId != this.id_usuario)
   		{
   			this.UsuariosNovos.push({USER_ID: userId.toString(), USER_NOME:userNome.toString()});
   			this.ListaUsuariosAux.push({USER_ID: userId.toString(), USER_NOME:userNome.toString()});
   		}   	

    }
    primeiraConexao++;
    ListaUsuariosAux.splice(0);

    for(i = 0; i < lista.length; i++)
    {
 		userId = lista[i].USER_ID.toString();
   		userNome = lista[i].USER_NOME.toString();
   		if(userId != this.id_usuario)
   		{
   			this.ListaUsuariosAux.push({USER_ID: userId.toString(), USER_NOME:userNome.toString()});
   		}   	

    }
   }
   else if(primeiraConexao > 0)
   {
   	for(i = 0; i < lista.length; i++)
    {
    	userId = lista[i].USER_ID.toString();
   		userNome = lista[i].USER_NOME.toString();

   		if(userId != this.id_usuario)
   		{

   			if(this.ListaUsuariosAux.length == 0)
   			{
    			for(aux = 0; aux < this.ListaUsuariosAux.length; aux++)
    			{
    				userId2 = this.ListaUsuariosAux[aux].USER_ID.toString();
    				userNome2 = this.ListaUsuariosAux[aux].USER_NOME.toString();

    				if(userId2 != userId)
    				{		    					
    					this.UsuariosNovos.push({USER_ID: userId.toString(), USER_NOME:userNome.toString()});
    				}
    			}
    		}
   		}

	}

    // limpa o array para receber os usuarios novamente depois
    ListaUsuariosAux.splice(0);

    for(i = 0; i < lista.length; i++)
    {
 		userId = lista[i].USER_ID.toString();
   		userNome = lista[i].USER_NOME.toString();
   		if(userId != this.id_usuario)
   		{
   			this.ListaUsuariosAux.push({USER_ID: userId.toString(), USER_NOME:userNome.toString()});
   		}   	

    }		    
   }	

if(this.UsuariosNovos.length > 0)
{
	onPlayVideo();
}
}

 

 

Função no Flex que insere o video dos usuarios na tela, em seguida a classe usada para montar o video na tela.

private function onPlayVideo():void
{					
var i:int;
var aux:int = 0;
var userNome:String;
   var userId:String;

var inicioCont:int = 0;

if(UsuariosAtuais.length > 0){
	inicioCont = UsuariosAtuais.length;
}

for(i=inicioCont; i<9; i++){

	setInterval(sleep,3000);

	aux = i+1;
	userId = this.UsuariosNovos[i].USER_ID.toString();
    userNome = this.UsuariosNovos[i].USER_NOME.toString();				

	var campoVideo:VideoConferencia = new VideoConferencia();

	HBoxConf1.addChild(campoVideo.addConferencia(160,120,userId,userNome,nc));

}		

}

 

Monta os videos. Acho que é aqui o problema, na função 'campoVideo()'. Eu coloquei um try catch pra tenta descobri o problema mas não adianto muita coisa.

package conferencia
{
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;

import mx.containers.Canvas;
import mx.controls.Alert;
import mx.controls.Image;
import mx.controls.Label;
import mx.controls.VideoDisplay;


public class VideoConferencia
{
	public var width:int;
	public var height:int;
//		public var nsUsuario:NetStream;
//		public var nc:NetConnection;

	public function VideoConferencia()
	{
		super();
	}

	public function addConferencia(width:int, height:int, userId:String, userNome:String, nc:NetConnection):Canvas
	{
		var campoCanvas:Canvas = new Canvas();

		this.width = width;
		this.height = height;

		campoCanvas.addChild(campoImagem());
		campoCanvas.addChild(campoVideoDisplay(campoVideo(userId)));		
		campoCanvas.addChild(campoLabel(userNome));

		return campoCanvas;
	}

	public function campoImagem():Image
	{
		var imagem:Image = new Image();
		imagem.width=this.width;
		imagem.height=this.height;
		imagem.source="../imagens/no_cam.png";

		return imagem;
	}

	public function campoVideo(userId:String):Video
	{
		var nsUsuarios:NetStream = null;
		var nc:NetConnection = new NetConnection();

		try
		{
			nc.connect("rtmp://192.168.0.149/MultiConferencia", "");
			nsUsuarios = new NetStream(nc);
			nsUsuarios.bufferTime = 0.5;
			nsUsuarios.play(userId);			

			var video:Video = new Video();
			video.attachNetStream(nsUsuarios);
			video.width=this.width;
			video.height=this.height;
		}
		catch(erro:ArgumentError)
		{
			Alert.show("<ArgumentError> "+ erro.message);
		}
		catch(erro:Error)
		{
			Alert.show("<Erro> "+ erro.message);
		}		

		return video;
	}

	public function campoVideoDisplay(video:Video):VideoDisplay
	{
		var display:VideoDisplay = new VideoDisplay();
		display.width=this.width;
		display.height=this.height;
		display.setStyle("backgroundAlpha","0.0");

		display.addChild(video);

		return display;
	}

	public function campoLabel(userNome:String):Label
	{
		var textoCam:Label = new Label();

		textoCam.text = userNome;
		textoCam.x=0;
   		        textoCam.y=120;
   		        textoCam.width=160;

   		        return textoCam;
	}

}
}

 

 

Bom pessoal, esses são os codigos e quero que vcs dem uma olhada, pois não sei se estou fazendo tudo da maneira correta, principalmente na parte de conexao na parte que insere os video na tela.

 

Se alguem souber o que é ou tem alguma dica posta ai!!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, alguem já trabalho com Flex e Red5 ?!

To me quebrando um poco, principalmente pelo fato de eu não saber onde encontro documentação do Red5 que explique o que cada uma daquelas funções Java faz e como usar o Flex com o Red5.

 

Alguem pode me da um Help!??

 

:(

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.