Adobe Flex, RED5 e Streaming

Introdução

Ainda lembro a minha primeira quase “transmissão” de um evento pela Internet, um festival de dublagem na minha cidade natal (litoral do Paraná) em meados de 1997/1998, o objetivo era enviar para o site do colégio imagens das apresentações. Na época a conexão mais rápida era de 56Kbps, é isso mesmo, linha discada, um modem externo US. Robotics que se conectava com o PC pela porta paralela, um servidor Linux para compartilhamento da conexão. Conexões USB`s não eram muito utilizadas, a Web Cam utilizava a interface paralela e também a conexão do teclado, nem perto da qualidade da imagem das Web Cams atuais. Bom, com toda essa limitação tecnológica e os meus 15 anos o que consegui foi, fazer capturas das apresentações utilizando a Web Cam, (demorava um bocadinho), e com um programa FTP eu enviava essas imagens para o host onde o site do colégio estava hospedado. Só foi possível porque o software de captura da câmera podia ser configurada para capturar as imagens quando detectava movimento, e o software FTP possibilitava o agendamento de upload toda vez que um arquivo era modificado. Foi divertido, um desafio, que foi solucionado com o pouco conhecimento e os poucos recursos disponíveis na época.

Por que tudo isso?

Em um passeio para ir pegar café, e dar um out do computador pra respirar um pouco, fui informado que o próximo evento da empresa que será em setembro será transmitido pela Internet, e que a responsabilidade de levantar o Know How estava nas minhas mãos. Gostei, mais um desafio para ser superado, e mais conhecimento para ser adquirido. Voltei pra minha mesa já pensando em mil possibilidade e entendendo a complexidade de concretizar tudo isso.

Realidade

Muitas pessoas já pensaram, é fácil, mas vamos a realidade, fatos que devemos levar em consideração:

  • A captura da imagens é feita em HD (High Quality), 1080p pra ser mais preciso;
  • O evento não tem um local fixo para acontecer;
  • Levar em consideração a possibilidade de envio de audio/vídeos simultâneos (vários “canais”);
  • Prever como enviar ao servidor de Streaming o conteúdo (acesso à Internet);
  • A mesa de corte utilizada não possui saida de vídeo em FireWire, somente em Y,B,R e SDI;
  • Custos tendendo a zero, principalmente no que se diz respeito à Infra-estrutura e Softwares.

Tecnologia

Levando em consideração esses pontos semana passada, mais exatamente na quinta-feira comecei um estudo sobre transmissão de audio/vídeo utilizando FMS (Flash Media Server), já tinha visto a algum tempo o RED5 (osflash.org/red5) achei interessante pois é Open Source (custos reduzidos) e utilizando o Java, é possivel criar os serviços e mais, montar serviços que interajam com outras aplicações, interfaces, dispositivos, tudo que o Java possibilita, isso é interessante quando se precisa de flexibilidade, característica essa que o Open Source carrega no sangue.

Comecei o estudo, baixei sua versão para o MAC OSX, e instalei. Sua instalação no Mac é simples, não tive problemas, o RED5 vem com uns demos, todos funcionaram perfeitamente. Bom o servidor estava rodando, agora faltava a aplicação.

Para a construção das aplicações decidí utilizar o Adobe Flex 3, pois já desenvolvo aplicações com ele a algum tempo, isso facilita bastante =). Não achei muita documentação do RED5 e o Flex, foi dificil fazer com que a aplicação conversasse com o RED5, mas funcionou. Primeiramente tentei reescrever as classes que vieram nos exemplos do RED5 de (Flash) ActionScript2 para (Flex) ActionScript3, foi sinistro e frustrante, dai pesquisando um pouco mais, consegui somente a classe de conexão pro RED5 em ActionScript3 (http://www.vadus.de/uni/red5/AS_red5_Connection.zip). Foi aí que a conexão funcionou.

Transmissão

Com a conexão em pé era a hora de tentar enviar o vídeo, trabalhar com as classes Video, Camera, NetStream no Flex não foi tão complicado, o Google ajudou bastante, foi atravéz dele que cheguei ao site www.rafaeldohms.com.br muito bom o artigo, e o Source Code disponibilizado pelo Rafael me ajudou muuuuito. Utilizei o código do Rafael como base pra montagem da classe de envio de recepção de audio/vídeo.
Mas faltava uma coisa ainda, o serviço no RED5 que ficaria responsável recebimento e distribuição do audio/vídeo. Tentei algumas vezes montar um novo serviço, sem sucesso. Foi então que tive a brilhante, ou nem tão brilhante idéia de utilizar o serviço da apicação demo. Um Chat com Vídeo que vem junto com o RED5. Depois de ler e re-ler o Java do serviço identifiquei o funcionamento do serviço e consegui enviar o conteúdo. Utilizei a própria interface do chat pra ver o resultado da transmissão. Faltava a última coisa agora, a parte de recepção do conteúdo. Essa não foi tão difícil, mais um pouco de leitura do Java do serviço do RED5 e, pronto, funcionando.

Testes

Testes de preformance e consumo de banda, na rede da minha casa, apontaram uma boa qualidade e um consumo de banda próximo a 250Kbps, isso efetuando a transmissão de uma camera (Web Cam) com audio. Mais testes, dessa vez na empresa, conectei uma camera de vídeo no meu note utilizando a interface FireWire, o sinal que estava sendo injetado era HDV, 60fps, [16:9]. O Flash Player não detectou o sinal, tive que configurar a camera pra DV, 60 fps, 16:9, menos qualidade, e o Flash Player detectou. Comecei as transmissões, não sei se é pelo fato da minha aplicação pegar a imagem gerada pela câmera e reduzir o tamanho dela, mas a imagem ficou bem ruim, o interlaçado quando o movimento era rápido, era mais do que visível. Fiz vários testes esperimentando reconfigurar o FPS da aplicação, o Bandwidth, a qualidade do vídeo, o Frame Interval, e quando cheguei a um resultado satisfatório, fui verificar a utilização da banda. É definitivamente não vai dar pra utilizar o RED5. Se fosse uma Web Cam as coisas já estariam resolvidas, mas como a realidade é outra, vou ter mais trabalho pela frente.

Encoder

Comecei pesquisas sobre a utilização de um Encoder no RED5 e ví que não é possivel a utilização de um.
Vou seguir com o projeto e pesquisar agora o Flash Media Server (Adobe) e o Wonza Media Server (Wonza) esses possibilitam a utilização de um Encoder.

Código

Vou disponibilizar o código das aplicações pro pessoal que precisar montar uma aplicação Flex utilizando recursos de audio/vídeo e o RED5, como por exemplo um software de Vídeo conferência. Eu montei a aplicação pra suportar vários streams, a qualidade é setada toda na aplicação, dando flexibilidade pra configurar como quizer.

Vai aqui o meu agradecimento ao Rafael por disponibilizar o conteúdo da aplicação dele, achei uma ótima iniciativa e seguindo este exemplo, também vou disponibilizar os códigos.

Abraços a todos…. qualquer dúvida estou a disposição…. [email protected]

Source Code

Links:

http://osflash.org/red5

http://www.adobe.com/products/flashmediaserver/

http://www.rafaeldohms.com.br/pt/

http://www.wowzamedia.com/