Flex + FMS, compartilhando a webcam
Flex + FMS, compartilhando a webcam
Um dia passamos pela web estática, hoje temos uma internet totalmente interativa e motivada por grandes multidões que estão conectadas as redes sociais dos mais variados tipos. E depois do BOOM vem a era multimídia sobre a internet, vídeos de alta definição(HD), redes sociais baseados em vídeos, fóruns baseados em comentários por áudios, podcasts, screencasts até filme inteiros é possível assistir hoje pela internet, isso tudo graças a doção, barateamento e o aumento da conexão de cada empresa, escola ou residência.
Ta mais o que isso tem haver com Flex + FMS? TUDO! Claro que tem a ver com tudo, com Flex temos todo o poder para criar aplicações ricas de interatividade e até mesmo as aplicações citadas acima. E com o Flash Media Server podemos estender este poder para algo mais além, algo mais interativo com áudio, vídeo e iteração multimídia em tempo real.
Quando começamos a desenvolver o Treina TOM não sabíamos que o Flex encaixaria com uma luva nesta implementação, a Adobe fez jus ao framework deixando ele totalmente flexível para o desenvolvimento também de aplicações multimídias, e com o Actionscript 3 foi fácil entender, pois a curva de aprendizado é bem baixa tornando o desenvolvimento mais produtivo.
Para você que não conhece o Actionscript 3 ou vem do Actionscript 2, não se preocupe, pois na mudança do Actionscript 2 para o Actionscript 3 a Adobe levou boa parte de sua estrutura e classes para um paradigma de análise, projeto e programação baseado na composição e interação entre diversas unidades que podemos chamar de objetos. Por isso vamos encontrar nomes de objetos idênticos a que era usado no AS2, porém agora eles são implementados de forma um pouco mais organizada e muito mais orientados a objetos.
A curva de aprendizado do Actionscript 3 é realmente baixa comparada a muitas linguagens de programação que existe hoje. AS3 é baseado no ECMAScript, assim como o Javascript. No Flex usamos o Actionscript para definir a lógica de nossa aplicação e o MXML para definir a interface da aplicação.
Desenvolver aplicações com Flex é muito bom, ou melhor, bom * 1000 De tão interativo que é, logo a paixão chega, e não é a toa que o Flex é um dos frameworks que mais cresce o número de empresas e desenvolvedores adotando-o.
E por onde começamos a aprender a fazer tudo isso?
Simples… Creio que você já sabe o que é Flex, e sabe claro o que é Flash Media Server, e têm eles instalados em sua máquina, então é hora de colocar a mão na massa!
Vamos recapitular, o que vamos fazer?
Bom este é simplesmente o primeiro tutorial de uma série de tutoriais que vamos criar aqui, para compartilhar com todos vocês a nossa expertisse que é Flex + Flash Media Server. E quem sabe em um futuro próximo Ruby on Rails? Neste tutorial vamos criar nossa primeira integração de Flex + FMS e de cara compartilhar pela internet a sua webcam ou qualquer outro dispositivo de vídeo ligado à máquina, então mãos a obra!
É hora de codar!
O primeiro passo é, crie um projeto dentro de seu Flex Builder chamado:
CompartilhandoAWebcam
Este projeto será composto pelo arquivo principal:
CompartilhandoAWebcam.mxml
Para esta aplicação iremos precisar somente de três funções, uma que cria a conexão com o servidor chamada de init(), uma que aguarda receber o status desta conexão chamada netStatus() e outra que vai dar um play na publicação enviada ao servidor que é chamada de cameraShow().
private var nc:NetConnection;
private var nsCli:NetStream;
private var nsPub:NetStream;
private function init():void
{
if(nc){
nc.close()
}
nc = new NetConnection();
NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;
nc.objectEncoding = ObjectEncoding.AMF0;
nc.addEventListener( NetStatusEvent.NET_STATUS, netStatus );
nc.connect("rtmp://localhost/fmsguru/");
}
A função init() é chamada assim que a aplicação é carregada através do evento creationComplete, dentro de seu corpo é criado uma instância do netConnection através da variavel nc.
Por default no Flex é usado a versão 3 do AMF, então é preciso setar o netConnection com o tipo de encoding correto ao do servidor FMS 2 que é a versão do AMF 0. Mas isso já foi resolvido com o FMS 3, pois irá suportar nativamente o AMF 3.
O próximo passo é adicionar um listener que identificará o status da conexão, passando assim um objeto para a função netStatus.
E para chamar a conexão através do método connect do netConnection passamos o endereço e o nome da aplicação criada no servidor fms. Por default usaremos o RTMP e o nome da aplicação fmsguru.
Para criar uma aplicação fms simples que só responderá as conexões e não precisa responder procedimentos remotos basta criar uma pasta dentro do diretório application da instalação de seu fms, conforme figura .
Com a função init pronta agora precisamos receber o status da conexão, para isso precisamos fazer algumas comparações com o resultado enviado através do evento NET_Status do netConnection.
private function netStatus( event:NetStatusEvent ):void
{
switch( event.info.code ) {
case "NetConnection.Connect.Success":
_label_status.text = "Status: Conexão realizada com sucesso!";
nsPub = new NetStream ( nc );
nsPub.attachCamera(Camera.getCamera());
nsPub.publish("myVideo");
break;
case "NetConnection.Connect.Closed":
_label_status.text = "Status: Conexão fechada!";
break;
case "NetConnection.Connect.Rejected":
_label_status.text = "Status: Conexão rejeitada!";
break;
}
}
A função netStatus então recebe o status da conexão que através de um switch faz a comparação com o código enviado pelo servidor FMS.
NetConnection.Connect.Success => Retorno de conexão realizada com sucesso.
NetConnection.Connect.Closed => Retorno identificando que a conexão foi fechada.
NetConnection.Connect.Rejected => Retorno identificando que a conexão foi rejeitada.
Dentro da condição de conexão realizada com sucesso criamos uma instância do NetStream. Esta classe abre uma comunicação para streaming entre a aplicação que esta rodando sobre o Flash Player e o Flash Media Server ou com o sistema de arquivos local, este objeto é um canal que roda dentro do NetConnection que pode publicar e receber dados, utilizando NetSream.publish ou NetStream.play, publicando assim áudio e vídeo em tempo real. Você também pode usar um objeto NetStream para enviar mensagens de texto ou objetos inteiros para todos os clientes que estão conectados a mesma instância da aplicação corrente usando um NetStream.send.
Assim que recebemos o resultado do servidor que a conexão foi realizada com sucesso anexamos a câmera default detectada pelo Flash Player.
nsPub = new NetStream ( nc );
nsPub.attachCamera(Camera.getCamera());
nsPub.publish("myVideo");
Quando criamos uma instância do NeStream é preciso passar para ele quem é o NetConnection, para assim anexar o dispositivo de vídeo ou microfone.
nsPub.attachCamera(Camera.getCamera());
Com Câmera.getCamera capturamos o dispositivo de vídeo 0 encontrado pelo Flash Player. Para listar todos os dispositivos basta buscar por Camera.names que irá retornar um array contendo os nomes dos dispositivos de vídeos.
Assim que anexamos com attachCamera é preciso publicar este dispositivo, para isso usamos nsPub.publish(“e o nome do vídeo”). O nome do vídeo pode ser qualquer string que o client irá encontrar no servidor para dar um play, é desta mesma maneira que podemos publicar vídeos em FLV, mas isso é um assunto para outro tutorial.
Bom, já temos uma conexão com o servidor e a webcam sendo publicada, agora é preciso dar um play nesta publicação para ver o vídeo que esta sendo transmitido.
A função cameraShow() é a responsável por isso, quando clicarmos no botão _btnCamShow a função irá fazer uma comparação identificando o label e em seguida abrir uma nova instância do NetStream que irá rodar sobre a variável nsCli.
private function cameraShow():void
{
if(_btnCamShow.label=="Camera Show!"){
_btnCamShow.label="Publicando!";
nsCli = new NetStream ( nc )
var vid:Video = new Video();
vid.height = _myVideoComponent.height;
vid.width = _myVideoComponent.width;
vid.attachNetStream( nsCli );
_myVideoComponent.addChild( vid );
nsCli.play("myVideo");
}else{
nsCli.close();
_btnCamShow.label="Camera Show!";
}
}
Parte do corpo deste código é parecido com a publicação do NetStream nsPub, a diferença é que lá publicamos o dispositivo anexado, e aqui damos um play na publicação myVideo.
Criamos também um novo objeto Vídeo que anexamos com attachNetStream ao NetStream nsCli, e assim que anexado adicionamos a um componente UIComponent.
<mx:UIComponent id="_myVideoComponent"
width="163"
height="130"
verticalCenter="-10"
horizontalCenter="0"/>
Pronto, a lógica da aplicação esta pronta!
Agora você já poderá adicionar o botão btn_Show e o label _labelStatus que irá mostrar o status da conexão , em seguida compilar e rodar.
Para acompanhar o resultado do streaming você pode abrir o Management Console do FMS e ver o resultado da trasmissão que esta ocorrendo sobre a aplicação fmsguru.
O Código fonte desta aplicação esta disponível aqui para download, caso tenha alguma dúvida é só deixar um comentário aqui pra gente e não esqueça de compartilhar com a gente o que você achou deste tutorial.
Grande abraço e boa diversão!
Hugo Campos em Flex + FMS, compartilhando a webcam em 10/02/2008 às 02:39 AM
Boa noite, eu sou um curioso como vcs, já havia mexido muito pouco com o flashcom 1.5 e 1.6, agora resolvi a mexe novamente com essa tecnologia li o artigo de vcs e achei muito interessate. Quero deixa aqui os meus parabéns a todos vcs.