Captura da entrada da câmeraFlash Player 9 e posterior, Adobe AIR 1.0 e posterior Além de arquivos de vídeo externos, uma câmera conectada ao computador de um usuário pode funcionar como fonte de dados de vídeo, que você pode exibir e manipular usando o ActionScript. A classe Camera é o mecanismo que foi incorporado ao ActionScript para trabalhar com uma câmera de computador. Noções básicas sobre a classe CameraO objeto Camera permite que você se conecte à câmera local do usuário e transmita o vídeo localmente (para o usuário) ou remotamente para um servidor (como o Flash Media Server). Usando a classe Camera, é possível acessar os seguintes tipos de informações sobre a câmera do usuário:
A classe Camera inclui vários métodos e propriedades úteis para trabalhar com objetos Camera. Por exemplo, a propriedade estática Camera.names contém uma matriz de nomes de câmeras que estão instaladas no computador do usuário. Você também pode usar a propriedade name para exibir o nome da câmera que está ativa. Nota: Ao transmitir fluxo de vídeo da câmera pela rede, trate sempre das interrupções da rede. Interrupções de rede podem ocorrer por muitos motivos, especialmente em dispositivos móveis.
Exibição do conteúdo da câmera na telaA conexão a uma câmera pode exigir menos código do que usar as classes NetConnection e NetStream para carregar um vídeo. A classe Camera também pode rapidamente se tornar complicada porque, com o Flash Player, você precisa da permissão do usuário para se conectar à câmera dele antes de acessá-la. Este código demonstra como usar a classe Camera para se conectar à câmera local de um usuário: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Nota: A classe Camera não tem um método construtor. Para criar uma nova ocorrência de Camera, use o método estático Camera.getCamera().
Desenvolvimento do aplicativo de câmeraAo criar um aplicativo que se conecta à câmera de um usuário, considere os seguintes aspectos no seu código:
Conexão à câmera de um usuárioA primeira etapa para se conectar à câmera de um usuário é criar uma nova ocorrência de Camera criando uma variável do tipo Camera e a inicializando com o valor de retorno do método estático Camera.getCamera(). A próxima etapa é criar um novo objeto de vídeo e conectar o objeto Camera a ele. A terceira etapa é adicionar o objeto de vídeo à lista de exibição. Você precisa executar as etapas 2 e 3 porque a classe Camera não estende a classe DisplayObject, por isso não é possível adicioná-la diretamente à lista de exibição. Para exibir o vídeo capturado da câmera, crie um novo objeto de vídeo e chame o método attachCamera(). O seguinte código mostra estas três etapas: var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); Observe que, se o usuário não tiver uma câmera instalada, o aplicativo não exibirá nada. Na prática, você precisa executar outras etapas que envolvem o seu aplicativo. Para obter mais informações, consulte Verificação da instalação das câmeras e Detecção de permissões de acesso à câmera. Verificação da instalação das câmerasAntes de tentar usar qualquer um dos métodos ou propriedades em uma ocorrência de Camera, é recomendável verificar se o usuário tem uma câmera instalada. Há duas maneiras de fazer essa verificação:
Como a classe Camera não estende a classe DisplayObject, não pode ser adicionada diretamente à lista de exibição usando o método addChild(). Para exibir o vídeo capturado da câmera, é preciso criar um novo objeto Video e chamar o método attachCamera() na ocorrência de Video. Este snippet mostra como conectar a câmera, se disponível; se não houver uma câmera, o aplicativo não exibirá nada: var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); } Detecção de permissões de acesso à câmeraNa caixa de proteção do aplicativo AIR, o aplicativo pode acessar qualquer câmera sem a permissão do usuário. No Android, no entanto, um aplicativo deve especificar a permissão CAMERA do Android no descritor do aplicativo. Para que o Flash Player possa exibir a saída de uma câmera, o usuário deve permitir o acesso do Flash Player à câmera explicitamente. Quando o método attachCamera() é chamado, o Flash Player exibe a caixa de diálogo Configurações do Flash Player, que pede para o usuário conceder ou negar acesso à câmera e ao microfone para o Flash Player. Se o usuário clicar no botão Permitir, o Flash Player exibirá a saída da câmera na ocorrência de Video no Palco. Se o usuário clicar no botão Negar, o Flash Player não conseguirá se conectar à câmera, e o objeto Video não exibirá nada. Para detectar se o usuário concedeu acesso à câmera para o Flash Player, você pode monitorar o evento status da câmera (StatusEvent.STATUS), como visto neste código: var cam:Camera = Camera.getCamera(); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); } function statusHandler(event:StatusEvent):void { // This event gets dispatched when the user clicks the "Allow" or "Deny" // button in the Flash Player Settings dialog box. trace(event.code); // "Camera.Muted" or "Camera.Unmuted" } A função statusHandler() é chamada assim que o usuário clica em Permitir ou Negar. Você pode detectar em qual botão o usuário clicou usando um destes dois métodos:
Verificando o eventos de status a ser despachado, você pode criar um código que lide com a aceitação ou a negação do acesso à câmera pelo usuário e fazer as devidas exclusões. Por exemplo, se o usuário clicar no botão Negar, você poderá exibir uma mensagem informando que ele deve clicar em Permitir se deseja participar de um bate-papo com vídeo, ou você poderá verificar se o objeto Video da lista de exibição foi excluído para liberar recursos do sistema. No AIR, um objeto Camera não despacha eventos de status, visto que a permissão para usar a câmera não é dinâmica. Maximização da qualidade do vídeoPor padrão, as novas ocorrências da classe Video têm 320 pixels de largura por 240 pixels de altura. Para maximizar a qualidade dos vídeos, sempre verifique se o objeto de vídeo tem as mesmas dimensões do vídeo retornado pelo objeto de câmera. Para obter a largura e a altura do objeto de câmera, use as propriedades width e height da classe Camera; em seguida, você pode definir as propriedades width e height do objeto de vídeo de modo que correspondam às dimensões dos objetos de câmera, ou pode passar a largura e a altura da câmera para o método construtor da classe Video, como visto neste snippet: var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(cam.width, cam.height); vid.attachCamera(cam); addChild(vid); } Uma vez que o método getCamera() retorna uma referência a um objeto de câmera (ou null se não houver câmeras disponíveis), você poderá acessar os métodos e as propriedades da câmera mesmo que o usuário negue acesso a ela. Isso permite que você defina o tamanho da ocorrência de vídeo usando a altura e a largura nativas da câmera. var vid:Video; var cam:Camera = Camera.getCamera(); if (cam == null) { trace("Unable to locate available cameras."); } else { trace("Found camera: " + cam.name); cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("Unable to connect to active camera."); } else { // Resize Video object to match camera settings and // add the video to the display list. vid.width = cam.width; vid.height = cam.height; addChild(vid); } // Remove the status event listener. cam.removeEventListener(StatusEvent.STATUS, statusHandler); } Para obter informações sobre o modo de tela cheia, consulte a seção Modo de tela cheia em Configuração de propriedades do palco. Monitoramento das condições de reproduçãoA classe Camera contém várias propriedades que permitem monitorar o status atual do objeto Camera. Por exemplo, este código exibe diversas propriedades da câmera usando um objeto Timer e uma ocorrência de campo de texto na lista de exibição: var vid:Video; var cam:Camera = Camera.getCamera(); var tf:TextField = new TextField(); tf.x = 300; tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (!cam.muted) { vid.width = cam.width; vid.height = cam.height; addChild(vid); t.start(); } cam.removeEventListener(StatusEvent.STATUS, statusHandler); } var t:Timer = new Timer(100); t.addEventListener(TimerEvent.TIMER, timerHandler); function timerHandler(event:TimerEvent):void { tf.text = ""; tf.appendText("activityLevel: " + cam.activityLevel + "\n"); tf.appendText("bandwidth: " + cam.bandwidth + "\n"); tf.appendText("currentFPS: " + cam.currentFPS + "\n"); tf.appendText("fps: " + cam.fps + "\n"); tf.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n"); tf.appendText("loopback: " + cam.loopback + "\n"); tf.appendText("motionLevel: " + cam.motionLevel + "\n"); tf.appendText("motionTimeout: " + cam.motionTimeout + "\n"); tf.appendText("quality: " + cam.quality + "\n"); } A cada 1/10 de segundo (100 milissegundos) o evento timer do objeto Timer é despachado, e a função timerHandler() atualiza o campo de texto na lista de exibição. |
![]() |