UPDATED (08/04/10)
Translation after each paragraph.
O seguinte exemplo é de uma aplicação de vídeo conferência com chat feita em Flex + Red5 (código fonte disponível para download).
The following example is a video-conference with chat application built in Flex + Red5 (source available for download).
A aplicação é simples, você entra com um nome para si e um nome para uma sala.
Se a sala não existir, ela será criada, se existir você entra nela junto com os outros que já estiverem.
Se teu nome já estiver em uso na sala hehe bem, eu não fiz controle de login para este exemplo então, vai dar erro.
Cada sala tem um HBox para as webcams (que podem ser habilitadas e desabilitadas, assim como os microfones) e um TabNavigator para os chats. Ao criar a sala ele cria um chat público e um tab único entre cada usuário na sala para conversas privadas.
The application is simple, you enter with a user name and a room name.
If the room doesn’t exist it will be created, if exists you will join the others in the room.
If your user name is already being used in the same room, well I didn’t make a login control for this example so it will throw error.
Each room has a HBox for the webcams (whitch can be enabled or disabled. Same for the microphones) and a TabNavigator for the chats. When the room is created it will create a public chat tab and a unique tab between each user for private chats.
Estou tentando conseguir um servidor para colocar a aplicação para vocês poderem testar, mas por enquanto serve uma screen-shot? rsrs
I’m trying to find a server to host the application so you can try it, but for now, here’s a screen-shot.
Consegui hospedar a aplicação, vocês podem testar aqui. Obrigado à Optimedia por emprestar o servidor o/
Se você não conseguir logar é porquê o servidor do Red5 caiu, tente mais tarde, infelizmente eu não posso dar manutenção nesse servidor, não tenho acesso.
I managed to host the application, now you can try it here. Thanks to Optimedia for borrowing the server o/
If you can’t login it’s because the Red5 server is down, try again later, unfortunately I can’t manage this server, I don’t have access.
A aplicação do Red5 é simples, apenas uma classe ‘Application.java’ com todos os principais métodos que uma aplicação Red5 precisa ter.
The Red5 application is pretty simple, just one class ‘Application.java’ with all the most important methods a Red5 applicatoin must have.
package br.com.flexbrasilia.red5demo; import java.util.ArrayList; import org.red5.server.adapter.ApplicationAdapter; import org.red5.server.api.IClient; import org.red5.server.api.IConnection; import org.red5.server.api.IScope; import org.red5.server.api.Red5; import org.red5.server.api.service.IServiceCapableConnection; import org.red5.server.api.so.ISharedObject; import org.red5.server.api.stream.IStream; public class Application extends ApplicationAdapter { @Override public boolean appStart(IScope scope) { System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.appStart #############################" ); System.out.println( "##############################################################################" ); return true; } @Override public synchronized boolean roomStart(IScope room) { if( !super.roomStart(room) ) return false; createSharedObject(room, "roomSO", false); System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.roomStart ############################" ); System.out.println( "##############################################################################" ); return true; } @Override public synchronized boolean appConnect(IConnection conn, Object[] params) { if (params == null || params.length == 0) { rejectClient("No username passed."); } IClient client = conn.getClient(); client.setAttribute( "userName", params[0].toString() ); System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.appConnect ###########################" ); System.out.println( "##############################################################################" ); return true; } @Override public synchronized boolean roomConnect(IConnection conn, Object[] params) { System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.roomConnect ##########################" ); System.out.println( "##############################################################################" ); return true; } @Override public synchronized boolean appJoin(IClient client, IScope scope) { IConnection conn = Red5.getConnectionLocal(); IServiceCapableConnection service = (IServiceCapableConnection) conn; Object[] param = new Object[] { client.getId() }; service.invoke("setID", param); System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.appJoin ##############################" ); System.out.println( "##############################################################################" ); return super.appJoin(client, scope); } @Override public synchronized boolean roomJoin(IClient client, IScope room) { if( super.roomJoin(client, room) ) { ISharedObject so = getSharedObject(room, "roomSO"); ArrayList<string> oldUserList = new ArrayList<string> (); ArrayList<string> newUserList = new ArrayList<string> (); Object[] obj = (Object[]) so.getAttribute("userList"); if( obj != null ) { for(int i=0; i<obj.length; i++) { oldUserList.add( (String) obj[i] ); } newUserList.addAll( oldUserList ); } newUserList.add( (String) client.getAttribute("userName") ); so.setAttribute("userList", newUserList.toArray()); } System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.roomJoin #############################" ); System.out.println( "##############################################################################" ); return true; } @Override public synchronized void roomLeave(IClient client, IScope room) { ISharedObject so = getSharedObject(room, "roomSO"); ArrayList<string> oldUserList = new ArrayList<string> (); ArrayList<string> newUserList = new ArrayList<string> (); Object[] obj = (Object[]) so.getAttribute("userList"); if( obj != null ) { for(int i=0; i<obj.length; i++) { oldUserList.add( (String) obj[i] ); } newUserList.addAll( oldUserList ); } newUserList.remove( (String) client.getAttribute("userName") ); so.setAttribute("userList", newUserList.toArray()); IStream videoStream = this.getBroadcastStream(room, client.getAttribute("userName")+"Video"); IStream audioStream = this.getBroadcastStream(room, client.getAttribute("userName")+"Audio"); if(videoStream != null) { videoStream.stop(); videoStream.close(); } if(audioStream != null) { audioStream.stop(); audioStream.close(); } System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.roomLeave ############################" ); System.out.println( "##############################################################################" ); } @Override public void roomStop(IScope room) { System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.roomStop #############################" ); System.out.println( "##############################################################################" ); super.roomStop(room); } @Override public void disconnect(IConnection conn, IScope scope) { System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.disconnect ###########################" ); System.out.println( "##############################################################################" ); super.disconnect(conn, scope); } @Override public void appStop( IScope scope ) { System.out.println( "##############################################################################" ); System.out.println( "############################ Red5Demo.appStop #############################" ); System.out.println( "##############################################################################" ); } }
Visto que algumas pessoas pediram, eu separei o código que você vai precisar no Flex. Foi feito em PureMVC, então para quem não conhecer, apenas esqueça as notifications. Segue a minha classe de conexão com o Red5, Red5ConnectionProxy:
Since some people asked, I separated the code you’ll need in Flex. It’s made in PureMVC, so those who are not familiar with it, just forget the notifications. Here’s my Red5 connection class, Red5ConnectionProxy:
package br.com.flexbrasilia.red5democlient.shell.model { import br.com.flexbrasilia.red5democlient.AppFacade; import br.com.flexbrasilia.red5democlient.assets.CommandConstants; import br.com.flexbrasilia.red5democlient.assets.NotificationConstants; import br.com.flexbrasilia.red5democlient.assets.vo.ChatMsgVO; import flash.events.AsyncErrorEvent; import flash.events.IOErrorEvent; import flash.events.NetStatusEvent; import flash.events.SyncEvent; import flash.net.NetConnection; import flash.net.SharedObject; import mx.controls.Alert; import org.puremvc.as3.multicore.patterns.proxy.Proxy; public class Red5ConnectionProxy extends Proxy { public static const NAME:String = 'Red5ConnectionProxy'; private var netConnection:NetConnection; //The SharedObject that will have my user list private var roomSO:SharedObject; private var userName:String; public function Red5ConnectionProxy() { super( NAME ); } public function connect(name:String, room:String):void { userName = name; if ( netConnection != null ) netConnection=null; netConnection = new NetConnection(); netConnection.addEventListener( NetStatusEvent.NET_STATUS, netStatus ); netConnection.addEventListener( IOErrorEvent.IO_ERROR, ioError ); netConnection.addEventListener( AsyncErrorEvent.ASYNC_ERROR, asyncError ); netConnection.connect( "rtmp://localhost/Red5Demo/"+room, userName ); netConnection.client = this; } private function netStatus(event:NetStatusEvent):void { switch ( event.info.code ) { case "NetConnection.Connect.Success": conected(); break; case "NetConnection.Connect.Closed": Alert.show("Não foi possível conectar.","Erro"); sendNotification(CommandConstants.RESET_APPLICATION); break; case "NetConnection.Connect.Failed": Alert.show("Não foi possível encontrar o servidor.","Erro"); sendNotification(CommandConstants.RESET_APPLICATION); break; default: Alert.show(event.info.code); } } private function ioError(event:IOErrorEvent):void { Alert.show(event.text); } private function asyncError(event:AsyncErrorEvent):void { Alert.show(event.error.message); } private function conected():void { roomSO = SharedObject.getRemote("roomSO", netConnection.uri, false); roomSO.addEventListener(SyncEvent.SYNC, onSharedObjectSync); roomSO.connect( netConnection ); roomSO.client = this; sendNotification( NotificationConstants.CONNECTED_TO_RED5 ); } private function onSharedObjectSync(event:SyncEvent):void { if(roomSO.data.userList) { _userList = roomSO.data.userList; sendNotification( NotificationConstants.NEW_USER_LIST ); } } private var _userList:Array = []; public function get userList():Array { return _userList; } public function sendMsg(chatMsgVO:ChatMsgVO):void { roomSO.send("newChatMsg", chatMsgVO.message, chatMsgVO.fromUser, chatMsgVO.toUser); } public function newChatMsg(chatMsg:String, fromUser:String, toUser:String):void { var chatMsgVO:ChatMsgVO = new ChatMsgVO(); chatMsgVO.message = chatMsg; chatMsgVO.fromUser = fromUser; chatMsgVO.toUser = toUser; sendNotification( NotificationConstants.NEW_CHAT_MSG, chatMsgVO); } } }
E a aplicação compilada (java + flex) com os arquivos de configuração pronta pra rodar aqui.
And the compiled application (java + flex) with the configuration files ready to run here.
Para rodar você vai precisar instalar a versão 0.9 final do Red5.
To run it you will need the Red5 0.9 final version.
Coloque o diretório Red5Demo no diretório ../Red5/webapps, inicie o Red5 e execute a aplicação flex (MainApp.html) do diretório Red5DemoClient (está configurada para procurar o serviço do Red5 no localhost).
Put the Red5Demo folder into ../Red5/webapps folder, start Red5 and run the flex application (MainApp.html) from folder Red5DemoClient (it’s configured to search for the red5 service on localhost).
Estou usando a versão 3.4 do sdk do Flex e Flash Player 10, veja aqui como atualizar.
I’m using the Flex sdk version 3.4 and Flash Player 10, see here how to update.
É isso, qualquer dificuldade é só entrar em contato.
That’s it, any problem, feel welcome to ask.
Hi, thx for your great application. I try to build my own chat application but i stuck with some oh the client side code. Could you please upload the source code of the flex app too?
Kind Regards,
Peter
The problem is that the app is mixed with another big app made in PureMVC so I don’t think the code would help you much.
But I’ll se if I can separate the code that matters to you and send to your e-mail, ok?
Thanks for the reply.
Daniel
Thank you very much – that would be great!!!
Peter
Boas, obrigado Daniel pelo artigo. No entanto, repetindo o que o Peter disse, não há possibilidade de colocar o código fonte do Flex? Iria dar uma grande ajuda em perceber como usar múltiplas webcams…
Agradeço desde já, abraço e boa continuação.
Opa, desculpe a demora pra responder, há semanas que eu não tenho tempo para abrir meu computador :/
Fica realmente complicado eu disponibilizar mais do meu código. Eu não tenho mais essa aplicação demo, foi o início de uma aplicação minha que já está bem evoluída.
Mas se você entender de pureMVC eu posso te passar as partes do código que forem referentes à criação das webcams e chat.
Fique à vontade para me escrever aqui ou mandar e-mails com tuas dúvidas, é um prazer ajudar.
Abraço
Hello,
Can you send me the sources of FLEX, thank you in advance
Sorry I don’t have the code anymore. It was the begining of another project that is a lot bigger today.
Tell me any question about it and I’ll be glad to help.
Best regards.
Daniel
Bonjour,
Je suis Français, je ne parle pas portugais, je m’excuse.
J’aimerai apprendre à utiliser red5 et le tutoriel que vous proposer sur le vidéo chat m’a énormément interessé.
Mais j’ai du mal à comprendre quelques détails et les sources côté client ( FLEX ) peuvent m’aider. Pouvez vous envoyer les sources côté client ( FLEX ) de votre projet Video chat ??
Cordialement.
Thank you for the reply.
I’m sorry but I don’t have the code anymore. It was the begining of another project that is a lot bigger today.
Tell me any question about it and I’ll be glad to help.
Best regards.
Daniel
Merci pour votre attention.
J’ai du mal à comprendre à quoi correspond le type ChatMsgVO
Pouvez vous me donner une petite explication ?
Merci d’avance.
Pouvez vous détailler les fonctions suivantes de chatMsgVO :
- message
- fromUser
- toUser
Merci d’avance.
Hi, ChatMsgVO means Chat Message Value Object.
It’s just my way to exchange the chat messages inside my flex application.
package br.com.optimedia.assets.vo
{
public class ChatMsgVO
{
public var message:String; // the message itself
public var fromUser:String; // the user name of the client who sent the message
public var toUser:String; // the user name of the client who must receive the message
}
}
I send the chat messages through the room shared object (roomSO) with the method
public function sendMsg(chatMsgVO:ChatMsgVO):void {
roomSO.send(“newChatMsg”, chatMsgVO.message, chatMsgVO.fromUser, chatMsgVO.toUser);
}
And all the other clients connected to the roomSO will receive a call to the method:
public function newChatMsg(chatMsg:String, fromUser:String, toUser:String):void {
var chatMsgVO:ChatMsgVO = new ChatMsgVO();
chatMsgVO.message = chatMsg;
chatMsgVO.fromUser = fromUser;
chatMsgVO.toUser = toUser;
sendNotification( NotificationConstants.NEW_CHAT_MSG, chatMsgVO);
}
Now you have the message in all your clients. See if the client user name is the same in the toUser field, and show the message.
Hope it helped.
Merci pour votre aide, est-il possible que vous puissiez me transmettre l’import suivant :
br.com.flexbrasilia.red5democlient.assets.CommandConstants;
Encore merci pour ce magnifique blog !
Sure, here it is:
package br.com.flexbrasilia.red5democlient.assets
{
public class CommandConstants
{
// START UP COMMANDS
public static const LOGIN_STARTUP:String = “LOGIN_STARTUP”;
public static const APPLICATION_STARTUP:String = “APPLICATION_STARTUP”;
public static const COCKPIT_STARTUP:String = “COCKPIT_STARTUP”;
public static const CHAT_WINDOW_STARTUP:String = “CHAT_WINDOW_STARTUP”;
public static const NEW_CHAT_WINDOW_STARTUP:String = “NEW_CHAT_WINDOW_STARTUP”;
// DISPOSE COMMANDS
public static const RESET_APPLICATION:String = “RESET_APPLICATION”;
public static const LOGIN_DISPOSE:String = “LOGIN_DISPOSE”;
public static const COCKPIT_DISPOSE:String = “COCKPIT_DISPOSE”;
public static const CHAT_WINDOW_DISPOSE:String = “CHAT_WINDOW_DISPOSE”;
public static const NEW_CHAT_WINDOW_DISPOSE:String = “NEW_CHAT_WINDOW_DISPOSE”;
}
}
Best Regards.
Daniel Pedrinha, Fera você esta de parabéns pelo tutorial excelente mesmo, pois eu to tendo uma certa dificuldade para manejar ele no servidor red5 eu coloquei no servidor local ele roda show de bola alterei algumas coisas do codigo, mais quando peço para clientes acessarem não vai so no servidor local por que sera??? Ele da erro de conexão quando clientes tentam acessar. Você pode me da uma ajuda ou dica como resolver isto. ??? Desde ja agradeço.
Bom dia André, obrigado pelo feedback.
O cliente consegue acessar a tua aplicação Flex mas não consegue conectar ao Red5 ou ele nem consegue acessar a aplicação Flex?
Preciso saber melhor onde a conexão pára pra poder te ajudar.
Mas já posso adiantar uma dica, se você estiver usando Windows no servidor, tente desabilitando o firewall do Windows. As vezes ele bloqueia o apache, o java, etc..
Abraço.
O Daniel obrigado pelo retorno, então fera, o cliente consegue acessar a pagina de login normal, mais quando tentar conectar da erro de conexao ao servidor red5 pois o mesmo roda no DEBIAN (NÃO USO RUINDOW$). Pois isto que acontece da conexão recusada. será que nao é permissão de algum directorio ??? Ja mexi em tudo que tu possa imaginar to zerando meu server fazendo do zero de novo pra ver o que pode ser.
Entao Fera, o cliente consegue acessar até a pagina de login, mais quando ele coloca o nome e nome da sala, da erro de conexão ao red5, pois estou usando o Debian 5 para servidor não uso o RUINDOW$ bani o windows da minha vida uns 5 anos ja … rsrs rsrsr Estou vendo agora sobre esquema de stream de audio e video on line. Bom este é meu problema, o que sera pode ser permissão de diretorio ???
Obrigado
A tua aplicação Flex está no mesmo domínio do servidor Red5? Se não, pode ser problema de cross-domain.
Se estiver no mesmo servidor, verifique no arquivo red5-web.properties,, dentro do diretório da tua aplicação, se o domínio está liberado para acesso na linha “webapp.virtualHosts=”
Para testar, coloque ” webapp.virtualHosts=* ” pra liberar todos os domínios.
Se não funcionar, me mande o log do teu servidor de quando um usuário tenta conectar e qual erro a aplicação Flex recebe.
Não deixe de verificar esses dois posts também:
http://www.flexbrasilia.com.br/blog/2010/03/erro-netconnection-connect-failed-no-admin-panel-do-red5/
e
http://www.flexbrasilia.com.br/blog/2010/04/instalacao-e-configuracao-de-um-servidor-red5-em-um-sistema-debian-lennyinstalling-red5-in-debian-lenny-os/
Abraço.
Daniel BOm DIA, fera continua do mesmo jeito, o que sera pode ser, ja vi portas reeinstalei um server do zero com os procedimento que vc me passo e nada o que sera pode ser, tipo baixei o sistema ai ja compilado e da na mesma o client so abre a tela inicial para Colocar o NOME e SALA quando insere estes dados, retorna de novo a mesma pagina de login, o que sera ??? ja entrei no seguinte diretorio, Red5Demo -> WEB-INF -> editei o seguinte arquivo red5-web.properties e dentro do arquivo tem o virtualhost que estava *,localhost,127.0.0.1 eu coloquei aqui o meu ip do servidor e nada tbm… Tem como vc me da uma ajuda…
Grato.
Ahh cara, não me liguei que você estava testando a minha aplicação demo.
Não vai funcionar mesmo, a minha aplicação Flex está configurada para conectar sempre em localhost, é apenas para testar na sua própria máquina mesmo.
Mas posso resolver isso pra vc, chegando em casa (no mais tardar amanhã) vou alterar para que você possa informar o IP do servidor na tela de login, blz?
Abraço
Seguinte vc tem o codigo fonte pra eu compilar ele novamente, com algumas alterações que eu fizer ??? Tem como vocême mandar por e-mail ou qual é o procedimento para compilação os parametros.
Grato.
Infelizmente o código fonte Flex eu não posso disponibilizar.
O máximo que posso fazer pra te ajudar é fazer a alteração que te falei e te passar o swf.
Abraço
Blz entao ja ajuda um pouco, ai eu vejo o que da pra fazer…me envia por e-mail tem como …
Beleza, te mandei por e-mail também.
Mas lembre-se que é pra colocar apenas o IP ou nome do domínio do servidor.
Abraço
O Daniel obrigado, pela atualização funfo legal apenas a questão de audio agora que não esta aqui pra mim 100% porque, esta indefinido o som como posso explicar melhor, ele não esta regulando legal o som, quando eu entro na sala e habilito o audio nussa fica terrivel e nao funciona nada de som apenas ouço ruidos altos. O que sera pode ser o meu server ou aplicação.
A aplicação, eu não fiz nenhuma regulagem de áudio nela, por padrão não é muito bom mesmo hehehe
Claro que o ideal é que estivesse configurado na aplicação, mas não era o foco do demo.
Mas você pode clicar com o botão direito na aplicação e ajustar algumas propriedades do teu microfone se quiser.
Abraço
Pronto, já atualizei os arquivos do Flex, é só baixar de novo.
Me avise se tiver qualquer problema.
Abraço
Você sabe onde encontro material que mostre um passo a passo de como criar esse codigo java, criar o .jar de forma correta para funcionar no Red5 ??
Estou tentando faz um tempo, e como nao consigo estou usando um pronto que achei na internet, mas é ruim ter um codigo que nao funciona de acordo com o sistema que estou desenvolvedo, tenho que fica fazendo POG pra funciona :(
Obrigado!
André, material sobre Red5 realmente é difícil encontrar.
Há alguma bibliografia em inglês se você procurar no Google, mas nada muito completo, o aprendizado de Red5 é meio na marra mesmo.
Mas eu coloquei todo meu aprendizado passo-a-passo aqui no blog, é só escolher a categoria Red5 e começar a estudar pelos posts mais antigos.
E qualquer dúvida fique à vontade para perguntar.
Abraço
Encontrei aqui no FlexBrasilia um exemplo simples de conexao hehe!
E eu rodei o demo que vc coloco ai pro pessoal baixa e funfo legal, eu tbm estou fazendo um sistema de video conferencia e vi que o demo que vc coloco ai faz algo que estou tentando fazer no meu sistema e ainda nao consigo e quero sabe se vc pode me ajudar a faze!
Vi que cada vez que alguem loga no sistema ele cria automaticamente um campo para exibir o video do usuario, mas enquanto não aparece o video fica uma imagem, e é justamente isso que quero faze!
Não vo escreve mais pra isso não vira uma redação, mas tem como vc entra em contato comigo por e-mail pra gente troca uma ideia sobre isso?!
Obrigado!
Ok, não tem mistério, entrarei em contato.
Hi,
Your code has been very usefull so far, but can you give me some details on how the Microphone is integrated? I.e. how should I create my netstream to publish to the room, and how the room can listen to my broadcast?
First you need a sharedObject with the list of the netStream names so everybody in the room know which netStreams are being published and play it.
Every time you publish a stream you must add it to that sharedObject.
And here’s how you atach the camera to the netStream:
netStream.attachAudio( Microphone.getMicrophone() );
Hope that helps.
Muito legal sua explicacao pena nao ter disponibilizado to do fonte do cliente.
Deixa tirar uma duvida como vc estabelece uma conversa privada com somente um usuario?
Outra coisa quando vc recebe uma mensagem do Red5 como que o flex sabe que esta mensagem tem que chegar no metodo:
public function newChatMsg(chatMsg:String, fromUser:String, toUser:String):void
Fala cara, seguinte.
Na função
public function sendMsg(chatMsgVO:ChatMsgVO):void {
roomSO.send(“newChatMsg”, chatMsgVO.message, chatMsgVO.fromUser, chatMsgVO.toUser);
}
Eu estou falando pro meu Shared Object roomSO chamar a função “newChatMsg” em todos os clientes conectados a ele.
Nessa função eu defino quem enviou e quem deve receber, se todos ou se alguém específico, aí no meu programa eu trato quando receber a msg se mostra ou não pro client.
Simples assim :)
Abraço
those are really big comments ! :D
Have not tested this code but i see in you ApplicationAdapter you are redefining your whole user list in the SharedObject over and over, i prefer to use one sharedobject as the user list so each property is an user data so this way only new data is sended to swf clients my userlist is something like this userlist_so[userUID] hope this make sense.
Sure it make sense!! Actualy it should have a better performance than my approach.
I appreciate the feed back ;)
My goal was to show only the basics of the communication between Red5 and Flex, so I tryed to not complicate the code.
And by the way, nice web site.
no problem i was just trying to collaborate to create a better multiuser world :)
and thanks im still working in the design for the next version of my website hope it will be online soon.
Oi Daniel. Antes de tudo, parabéns pelo excelente post.
Estou implementando aquí na empresa um serviço de atendimento online e gostaria de saber de você como eu posso implementar o fromUser/toUser usando FMS (opção da empresa).
Ou seja, os atendentes terão uma lista de solicitantes e só enviarão mensagens para o solicitante eventualmente selecionado neste datagrid. Por outro lado, o solicitate não terá a lista de usuários e só poderá enviar mensagem para um atendente pré-determinado.
Se puder me dar uma luz do uso do fromUser/toUser agradeço demais cara, já não sei mais onde procurar ajuda.
Valeu.
Bom dia Leonardo.
Usando o FMS você pode criar um SharedObject com a lista de usuários e na aplicação cliente filtrar, de acordo com o tipo de cliente, como aparecerá a lista.
Para mandar dados de um usuário para o outro há algumas maneiras de fazer. Você pode chamar um método no servidor que por sua vez enviará a chamada para o outro usuário, ou criar uma NetStream entre os usuários e chamar métodos diretamente no outro com o comando NetStream.send();
Mas para o que você quer não há necessidade de implementar lógica server-side, você pode fazer a comunicação diretamente entre os usuários (peer-to-peer) utilizando o protocolo RTMFP que o Flash Player 10.1 suporta. Tenho alguns artigos sobre RTMFP aqui no blog, dê uma olhada.
À disposição.
Daniel
Muito obrigado pela resposta. Vou ver os artigos indicados.
ola , boa iniciativa, vboce podeira postar os codigos dos seguintes arquivos:
AppFacade;
CommandConstants;
NotificationConstants;
ChatMsgVO;
Esses arquivos são apenas arquivos do Framework PureMVC.
Você não precisa implementar o PureMVC no teu projeto para usar com o Red5.
Tudo que você precisa saber pra integrar Flex + Red5 está descrito neste artigo.
Abraço.
Daniel Pedrinha
Ei Daniel, vc ja rodo esse sistema ou outro sistema de videoconferencia de n x n usuarios se comunicando ao mesmo tempo pela internet usando o Red5 e flex ?!
Se vc ja rodo, qual a sua opinião quanto a qualidade dos videos e do audio?
E vc sabe se um usuario com uma internet de 1 mega envia e recebe os video de boa ??
Valeu!
A qualdiade dos vídeos e audio depende da sua configuração, você comfigura no Flex a qualidade e tamanho que você quer.
Quanto maior a qualidade mais vai exigir do teu servidor e da banda, aí vai depender da potência do teu servidor.
Internet de 1mb dá pra enviar e receber uns 5 ou 6 vídeos numa qualidade boa.
Abraço
Ae Daniel, não rola um pagamento para ter a app do flex ? Seria interessante ? Estou bem interessado !
Me mande um e-mail pra conversarmos melhor.
daniel@flexbrasilia.com.br
Valeu, abraço
Daniel, por acaso esse codigo java que voce postou ai retorna, por exemplo, um array com os nomes dos usuarios para as rooms correspondentes ?
Estou estudando isso e ainda não consegui fazer a função roomJoin() retornar os usuarios de cada sala para o Flex.
Valeu!
Não, o método roomJoin não retorna nada ao client pois ele é chamado automaticamente ao se conectar e não deve ser chamado pelo client manualmente. Mas ele guarda sim quem está conectado, em um SharedObject. Basta o teu client sincronizar este SharedObject.
Abraço
Cara, eu tava tentando com o teu codigo e por algum motivo nao tava dando certo, dai criei um novo projeto Flex aqui(pra teste) e usei a sua Application.java e consegui faze com que a lista de usuarios referente a room seja retornada!
Porem ele só retorna os nomes, dai estou tentando inserir o id e nome num HashMap na Application e vou tentar retornar ela em um Objeto para o Flex.
Por enquanto estou apanhando nisso, mas ta indo!
Valeu pela atenção e pela ajuda!
Primeiramente, queria parabenizar pelo blog… excelentes posts!
Segundo, segui os passos do seu post e estou rodando normalmente a aplicação. Se eu abrir o browser, eu consigo entrar com meu usuário e com a URL “rtmp://localhost/myapp”, se abro outro browser, entro com outro usuário normalmente tb… se uma outra pessoa quer acessar esse meu chat, não consegue, o status é “Failed”. Eu já alterei o valor de “webapp.virtualHosts” para “*” para aceitar qualquer ip, desativei o firewall mas não vai. Alguma solução?
Obrigado!
Boa tarde Felipe, que bom que gostou do blog.
Há muito tempo que fiz essa app, não me lembro direito, mas…
Status Failed significa que o serviço rtmp não foi encontrado.
A pessoa que não consegue se conectar está acessando a aplicação Flex de um servidor Apache na mesma máquina do serviço Red5 ou está rodando diretamente a app de sua própria máquina?
Um erro comum é a pessoa estar acessando pelo servidor Apache e deixar no endereço rtmp para conectar-se a localhost.
Mesmo a app Flex estando no servidor do Red5, a pessoa precisa especificar o ip ou domínio do servidor.
Verifique isso e me avise.
Abraço
Obrigado por responder…
O que acontece é… aqui no trabalho estamos todos conectados na rede, fiz a aplicação na minha máquina, instalei o apache-tomcat e configurei pra minha app do Flex… até aqui ok!
Instalei o red5 na minha máquina tb, configuei certo os arquivos do WEB-INF, está ok o servidor do red5!
Ao tentar acessar na minha máquina, com meu ip da rede, ex: 192.168.0.114 (pois inseri no virtualhost) ele conecta normal… agora o que eu gostaria q vc me ajudasse… Como fazer q outra pessoa da msm rede que eu, acessando a minha app do Flex na máquina dele? Se ele colocar o ip 192.168.0.114 dá o erro de Failed, sabe o que pode ser?
Obrigado!
Bom, é o seguinte… o apache-tomcat e o red5 está instalado na minha máquina(porta 8080 e 5080 respectivamente) e a app esta rodando no tomcat normal…
O meu vizinho de baia… rs que está tentando acessar minha app, consegue entrar normal… mas quando tenta conectar no rtmp, com o meu ip da rede, o erro de Rejected e Closed é mostrado… o q precisa ser configurado?
Obrigado!
Bom, é Rejected ou Failed? Os erros implicam em problemas diferentes. Rejected é o Red5 negando acesso, Failed é pq não encontrou o serviço rtmp.
Vou instalar aqui na minha máquina como vc está fazendo e testar.
Posto aqui em seguida.
Meu amigo, acabei de testar aqui uma nova instalação toda nova em outra máquina seguindo o meu próprio blog e funcionou perfeitamente, todos na rede se conectaram sem problemas.
Imagino que você não esteja usando a app Flex que eu disponibilizei no blog, certo?
Teste com a minha aplicação pois é certo que ela funciona, mas siga exatamente como disse no blog pois a aplicação não permite mudar o nome da app, apenas o IP pode variar mesmo (ou domínio).
Mas é provavelmente um erro de infra. Verifique se você não está com 2 serviços rtmp rodando, como por exemplo outro Red5 ou um FMS (eu mesmo caí nesse erro quando estava testando pra vc hehe).
Verifique se na tua rede não há um proxy com firewall ativo, ele pode estar bloqueando o tráfego na rede.
Verifique e me avise, boa sorte.
Abraço
Daniel, realmente eu alterei um pouco a app sim… mas nd q alterasse a infra…
Bom… funcionou aqui… primeiro eu tinha q liberar as portas do meu firewall pro rtmp e alterar o host no red5.properties… funcionou corretamente! o/ muito obrigado msm!!! Obrigado!!!
Vou escrever um outro post pra uma outra dúvida… hehehe
Hi,
Please, can you post the flv source file of the application, please.
Thx a lot in advance
My friend, I developed the app in Adobe Flex, not Flash.
But anyway, sorry but I can’t give you the source code.
As Red5 is an open source project I try to help everybody with the knowledge I get as they help us.
But altough Flex SDK is now open source too, it’s the tricky part and it’s my job, so I cant give the app for free, I sell it.
But please, feel free to write to my e-mail daniel@flexbrasilia.com.br any difficulty that you have and I’ll be happy to help you.
Daniel