O Red5

o Red5 é um servidor de RTMP de código aberto e desenvolvido em Java e possui suporte as seguintes funcionalidades:

  • Streaming de Audio/Video (FLV e MP3)
  • Gravação de Streaming (somente FLV)
  • Shared Objects
  • Publicação em Tempo Real
  • Remoting (Action Message Format)

Instalação

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.

Configuração e teste

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.

Um exemplo

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.

Fique por dentro de nossas novidades, ideias e atualizações