O Flash Media Server é um produto licenciado da Adobe, que possui duas formas duas formas de licenciamento
O software Adobe Flash Media Interactive Server oferece uma combinação exclusiva de recursos poderosos de mídia de fluxo contínuo e um ambiente flexível para criar e fornecer aplicativos de mídia social interativa para o público mais amplo possível. Ele proporciona um ambiente bastante avançado, fluxo contínuo mais seguro, aprimoramentos de fluxo contínuo ao vivo, suporte para H.264 e HE-AAC padrões da indústria e fornecimento de fluxo contínuo para celulares com os softwares Adobe Flash Lite? 3 e Adobe Media Player.
O Adobe® Flash® Streaming Server tem um preço acessível e é a próxima etapa no uso de download progressivo para o fornecimento de vídeo. Ele proporciona um ambiente bastante avançado, fluxo contínuo mais seguro, aprimoramentos de fluxo contínuo ao vivo, suporte para H.264 e HE-AAC padrões da indústria e fornecimento de fluxo contínuo para celulares com os softwares Adobe Flash Lite? 3 e Adobe Media Player.
Bom, lendo as notas acima, tirados do Site da Adobe dá para notar o seu maior poder em relação ao Red5. O Flash Media Streaming Server não possui suporte a SharedObject.
Outra grande diferença é o suporte e a alta quantidade de livros, manuais e ajuda existentes sobre o Flash Media Server. Um exemplo disso é o DevNet em http://www.adobe.com/devnet/flashmediaserver/ que é a maior referencia de tutoriais de Flash Media Server da internet.
Em testes, o Flash Media Server foi muito mais estável principalmente no compartilhamento de vídeo e também foi melhor quando necessário alta qualidade de vídeo, utilizando o Adobe Flash Media Live Encoder 3 para publicar o vídeo.
Vamos agora criar um aplicativo que se conectará ao Flash media Server.
<?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 { FMSStatus.text=e.info.code; switch ( e.info.code ) { case "NetConnection.Connect.Success": statusConnection=true; break; case "NetConnection.Connect.Closed": break; case "NetConnection.Connect.Rejected": break; } } private function publicar():void { if ( nsPub != null ) { btPublicar.label="Publicar no servidor FMS!" nsPub.close() nsPub=null } else { btPublicar.label="Parar publicação!" nsPub=new NetStream( nc ); nsPub.attachCamera( Camera.getCamera()); nsPub.attachAudio( Microphone.getMicrophone()); // 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 FMS!"; 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/live"/> <mx:Button label="Conectar ao servidor" click="init()"/> <mx:Label id="FMSStatus" left="178" top="12" text="Aguardando conexáo"/> </mx:HBox> <mx:VBox enabled="{statusConnection}"> <mx:HBox> <mx:Button id="btPublicar" label="Publicar no servidor FMS!" left="7" top="40" width="320" enabled="{statusConnection}"/> <mx:Button id="btVisualizar" label="Visualizar do servidor FMS!" left="7" top="40" width="320" enabled="{statusConnection}"/> </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 instância 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.