o Red5 é um servidor de RTMP de código aberto e desenvolvido em Java e possui suporte as seguintes funcionalidades:
Atualmente na versão 0.9.1 Final pode ser baixado nos seguintes links: OSX | Windows | ZIP | Tarball | Replacement Jar
Estou utilizando a versão 0.8 por estar estável. Os intaladores possuem o tomcat imbutido na instalação.
Após a instalação acesse http://localhost:5080/. Há a página dos demos(http://localhost:5080/demos/), mais que só funcionam após instalar os serviços em http://localhost:5080/installer/.
Então agora acesse http://localhost:5080/installer/ e terás a tela abaixo:
Selecione o aplicativo fitcDemo e clique em Install. Aguarde o Alert de concluído e vamos ao App.
Vamos agora criar um aplicativo que se conectará ao Red5 e transmite a câmera.
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" horizontalAlign="left" backgroundColor="#f6f6f6" backgroundGradientColors="[#f6f6f6, #bbbbbb]" viewSourceURL="srcview/index.html"> <mx:Script> <![CDATA[ import mx.controls.Alert; private var nc:NetConnection; private var nsCli:NetStream; private var nsPub:NetStream; [Bindable] private var statusConnection:Boolean=false /** * Inicia a aplicação e faz a conexão */ private function init():void { if ( nc != null ) nc=null; nc=new NetConnection(); nc.addEventListener( NetStatusEvent.NET_STATUS, netStatus ); nc.connect( hostRTMP.text ); nc.client=this; } /** * Método necessário para que não haja erro na chamada. * Ele será invocado e retornará o ID da conexão */ public function setId( id:Object ):void { } /** * Método que recebe o Status da conexão */ private function netStatus( e:NetStatusEvent ):void { RED5Status.text=e.info.code; switch ( e.info.code ) { case "NetConnection.Connect.Success": statusConnection=true; break; case "NetConnection.Connect.Closed": statusConnection=false break; case "NetConnection.Connect.Rejected": statusConnection=false break; } } private function publicar():void { if ( nsPub != null ) { btPublicar.label="Publicar no servidor Red5!" nsPub.close() nsPub=null } else { btPublicar.label="Parar publicação!" nsPub=new NetStream( nc ); nsPub.attachCamera( Camera.getCamera()); // nome que será publicado nsPub.publish( "videoPublish" ); vdMinhaWebCam.attachCamera( Camera.getCamera()); } } private function visualizar():void { if ( !statusConnection ) { Alert.show( "Não conectado ao servidor!" ) return; } if ( nsCli != null ) { btVisualizar.label="Visualizar do servidor de Red5!"; nsCli.close(); nsCli=null } else { btVisualizar.label="Parar Visualização!"; nsCli=new NetStream( nc ) var vid:Video=new Video(); vid.height=uiCaixaDoVideo.height; vid.width=uiCaixaDoVideo.width; vid.attachNetStream( nsCli ); uiCaixaDoVideo.addChild( vid ); // nome que foi publicado nsCli.play( "videoPublish" ); } } ]]> </mx:Script> <mx:HBox> <mx:TextInput id="hostRTMP" text="rtmp://localhost/fitcDemo"/> <mx:Button label="Conectar ao servidor" click="init()"/> <mx:Label id="RED5Status" left="178" top="12"/> </mx:HBox> <mx:VBox enabled="{statusConnection}"> <mx:HBox> <mx:Button id="btPublicar" label="Publicar no servidor Red5!" click="publicar()" left="7" top="40" width="320"/> <mx:Button id="btVisualizar" label="Visualizar do servidor Red5!" click="visualizar()" left="7" top="40" width="320"/> </mx:HBox> <mx:HBox> <mx:VBox> <mx:VideoDisplay width="320" height="240" id="vdMinhaWebCam" left="10" top="85"/> </mx:VBox> <mx:VBox> <mx:VBox width="320" height="240" backgroundColor="#000000" left="10" top="334"> <mx:UIComponent toolTip="Captura de vídeo" id="uiCaixaDoVideo" width="100%" height="100%" x="10" y="353"/> </mx:VBox> </mx:VBox> </mx:HBox> </mx:VBox> </mx:Application>
O funcionamento é bem simples. Quando clicado em conectar, uma nova instância do NetConnection é criada e o status é apresentado ao lado do botão. Os botões de visualizar e publicar só são habilitados quando a conexão for aceita no RED5.
Quando clicar em Publicar, uma instância do NetStream é criada e utilizamos o método publish para enviar a a câmera e microfone ao Red5. quando clicamos em visualizar, uma instancia do NetStream é criada e utilizamos o método play para visualizar o que esta sendo publicado neste canal.
Veja abaixo como ficou o exemplo.
Código fonte aqui.