Gravando Vídeo da Web
Nesse post vou falar descrever meu calvário ao tentar fazer um gravador de vídeo para web, no início tentando fazer ele com Java, e depois partindo para uma solução em Flash.
Aproveitando meu trabalho anterior com multimídia em Java, a mesma empresa que me pediu o trabalho do player multimídia, me solicitou que eu fizesse um gravador de vídeo que usasse a webcam do usuário. Porém, rodando na web.
Além disso, o gravador de vídeo também deveria capturar o som do microfone.
Parte 1: Tentando com Java
Bom, lá fui eu tentar usar o JMF novamente, já que ele captura o vídeo quando instalado na máquina do usuário. Achei no site da Sun umas classes que complementam o JMF e mostram na tela o vídeo que está sendo capturado (o JMF sozinho não mostra).
O chato, porém, é que pra ele capturar vídeo é preciso ter algumas bibliotecas nativas (DLLs ou .so) instaladas no dekstop do usuário.
E com applets, vira aquele parto: fiz um applet assinado (que o usuário tem que aceitar o alerta de segurança), e fiz um esquema pra detectar se o usuário tinha as bibliotecas nativas. Caso não tivesse, eu redirecionava ele para uma página com o instalador.
Bom, aí começaram os problemas: embora gravasse o vídeo, o cliente disse que os usuários do seu sistema seriam os mais novatos possíveis, e não gostou da solução de instalação de bibliotecas nativas.
Além disso, para um applet conseguir usar o microfone não basta ele ser assinado. Se isso já não fosse incômodo o suficiente, eu teria que achar uma solução para criar o arquivo .java.policies na pasta do usuário. E mesmo assim, o applet não consegue gravar e reproduzir ao mesmo tempo (por questões de segurança). Me pareceu ser um bug na verdade, já que em vários fórums disseram que arrumando as policies isso funcionaria.
Com javawebstart, o som era gravado normalmente, mas além do problema das bibliotecas nativas e seu instalador, o cliente não gostou de ser uma aplicação não embutida na página.
Ou seja, resumindo: se você fizer em javawebstart, e instalar bibliotecas nativas no computador do usuário, funciona.
Mas ainda assim, o vídeo gravado não terá compactação, será em RGB ou YUV.
Depois de pesquisar outras soluções, cheguei a duas possíveis: comprar uma biblioteca que permite um applet gravar som e vídeo (da Vimas Technologies), porém só funciona no Windows; ou jogar tudo pro alto e tentar usar o Flash.
Parte 2: Usando Flash
Já que em Java não deu certo, e eu não podia deixar o cliente na mão, fui então pesquisar como fazer o gravador de vídeo em Flash.
Eu usei bastante Flash em 1999 e 2000, na época do Flash 3 e 4, pra fazer umas animações, ou seja, muita água rolou por debaixo da ponte desde então.
Muita gente sabe aqui que não gosto de usar Flash, Applets ou qualquer outro tipo de plugin para fazer coisas que é possível fazer com Javascript+HTML. Porém esse não foi o caso.
Depois de achar na web alguns exemplos ensinando como usar a câmera (existe um objeto ActionScript chamado Camera - simples, não?), eu li que para gravar o vídeo num servidor, eu precisaria de um serviço de hospedagem com suporte ao Flash Media Server, da Adobe.
Outra vantagem, é que o vídeo é gravado diretamente no servidor em formato .flv (que usa o codec h.264).
Após consultar alguns fóruns, indicaram o serviço da Influxis (estrangeiro), que disseram ser ótimo, além de serem parceiros da Adobe.
O cliente contratou o serviço, fui lá e configurei a conta, e aí tentei sair do “olá mundo” com o uso da câmera no Flash. Vi que usando o objeto NetStream, eu conseguia gravar um vídeo da câmera no servidor (e reproduzir, se necessário), bastando conectar o vídeo gravado num objeto Video. Tudo bem simples mesmo.
Bom, aí agora faltava elaborar mais o gravador: colocar botões, capturar os eventos, fazer pausa, stop, etc. E me deparei com algo que não esperava: a bagunça que virou o ActionScript.
Além de 3 versões, o Actionscript 2 é totalmente diferente do 3. Fora isso, boa parte do que eu tive que usar para criar o player, não estava documentada no help do Flash. Pra ajudar, existem vários sites da Adobe com parte da documentação, e coisas que você só acha em fórums (que não sejam da Adobe).
Ou seja, eu tive que ficar procurando pela web cerca de 70% do código final, que era de coisas não documentadas, e ficar na tentativa e erro.
Pra ajudar, depois de 4 horas tentando achar o motivo do gravador de vídeo ter parado de funcionar de repente, eu notei que ele precisa ter a largura e altura mínimas suficiente para mostrarem o alerta de segurança (que confirma se o usuário permite usar a câmera). Caso o flash não tenha altura e largura mínimas pra essa confirmação aparecer, simplesmente não há captura do vídeo.
Enfim, saiu, mais foi um parto. E espero que isso possa ajudar alguém que precise fazer o mesmo.