Webcam com Flex

Serão abordados assuntos referentes a filmagem pela internet e reprodução de vídeos, esta apostila utiliza os conhecimentos da apostila Flex e da apostila Red 5, pois iremos desenvolver pequemos projetos em Flex voltados para filmagem com webcam, quanto ao Adobe Flash Player não será mais comentado porque já o foi na apostila sobre Flex. Não será explicado o uso do servidor Red 5, consulte esta apostila em caso de dúvida.

1.1. Introdução

Se você quer apenas publicar vídeo não é necessário definir o objectEncoding. Basicamente para publicar vídeo é necessário uma instância do NetConnection e outra do NetStream. Publicar significa filmar através da webcam do usuário e salvá-la como um arquivo de vídeo (flv) no servidor Red 5 deixando-a disponível para visualização. No servidor Red 5 utiliza-se o serviço live.jar para visualização e gravação em tempo real.

Observação:
1) Para testar os exemplos desenvolvido nesta apostila é necessário a instalação do Red5 no computador do usuário, porque será utilizado o serviço live.jar e salvar os arquivos de vídeo na pasta  live/stream.
2) Eu instalei o Red5, cuja arquivo é setup-Red5-1.0.0-RC2-java6, dei o nome de Red5Java para a pasta de instalação.
3) Os arquivos publicados serão salvos em C:\Red5Java\webapps\live\streams.

1.2. Red 5

O servidor Red 5 utiliza o protocolo rtmp para transmitir videos pela internet com mais qualidade, sobre o red 5 acesse o link Red 5.

2. Player

O controle VideoPlayer é um player de vídeo que suporta skins, download progressivo de streaming multi-bitrate, e streaming de vídeo. Ele suporta a reprodução de arquivos FLV e F4V. O controle VideoPlayer contém uma interface com vários recursos para controlar a reprodução de vídeo. É útil quando você não deseja que o usuário interaja com o controle. Reproduzir significa executar o arquivo já gravado.

2.1. O bitrate ou bit rate
Ou taxa de bits em português, é a quantidade de bits por segundo de seu sinal de vídeo, são determinados por mega bits por segundo (mbps). É claro, maior bitrate, melhor qualidade no vídeo que é distribuído pela Internet e maiores necessidades de largura de banda, pois o vídeo ocupará mais bitrate.

Obs:
rate (reɪt): s.1. ritmo, at a rate of: a uma taxa de, at this rate: nesse ritmo.

O bitrate é independente do tamanho do vídeo, em altura e largura. Claro que para maior resolução do vídeo, requereremos um bitrate maior para conservar a qualidade.
Se queremos uma qualidade de vídeo que seja bem vista, poderíamos visar a um bitrate de 200 Kbps.
Se queremos nos dirigir a uma audiencia de computadores de área de trabalho, necessitaríamos um vídeo de maior qualidade, de modo que poderíamos aconselhar um bitrate em torno dos 400 Kbps.
Se queremos um vídeo de alta qualidade podemos pensar em um bitrate de 800 Kbps.
Para vídeo em HD (alta definição), necessitaríamos um bitrate em torno de 1300 Kbps.
Multi-bitrate significar enviar sinais diferente (baixo e alto) a fim de suprimir as velocidades da internet de baixa e alta qualidade ao mesmo tempo.

2.2. Vídeo Digital
A vantagem do vídeo digital reside no fato de poder ser gravado, reproduzido e regravado com ou sem edição, várias vêzes sem perda de qualidade, mas traz consigo a desvantagem de ser formado por um número muito grande de bits, o que exige grande capacidade de armazenamento e em termos de transmissão, exige uma banda muito grande.
A qualidade de um sinal de vídeo pode ser avaliada pelos parâmetro:
1 - Frame rate: número de quadros exibidos por segundo.
2 - Color depth: Número de bits por pixel que representa as informações de cor.
3 - Frame Resolution: Geralmente expresso em número de pixels horizontais e verticais.
Destes parâmetros, o Color Depth está diretamente ligado ao formato do vídeo digital, assim, 4:4:4 requer 24 bits por pixel 4:2:2 requer 16 bits por pixel enquanto 4:1:1 requer 12 bits por pixel.
Exemplo:
4:4:4 significa que os pixels R , G , B são amostrados para cada ponto da imagem.
4:2:2 significa que para cada 4 pixels Y temos 2 pixels R-Y e 2 pixels B-Y.
4:1:1 significa que para cada 4 pixels Y temos 1 pixel R-Y e 1 pixel B-Y.

Cada pixel tem 8 bits, então 8*(4+4+4) / 4 = 24 , 8*(4+2+2) / 4 = 16 , e 8*(4+1+1) / 4 = 12.

Um vídeo de 30 fps, 4:4:4 e 640x480 pixels contém 216 Megabits por segundo, ou em termos de memória, convertendo bits em BYTES ; 216 / 8 = 27 Megabytes por segundo de exibição.

2.3. Arquivo.flv

Flash Video (FLV) é o nome de um formato de arquivo usado para fornecer vídeo pela Internet usando o Adobe Flash Player . O conteúdo de vídeo flash também pode ser incorporado dentro de arquivos SWF. O Flash Video refere a um formato de arquivo proprietário, tendo a extensão FLV, mas a Adobe apresentou novas extensões de arquivo e tipos MIME e sugere usar aqueles em vez do antigo FLV:

Extensão de arquivo Ftyp Tipo MIME Descrição
. F4V 'F4V' video/mp4 Vídeo para o Adobe Flash Player
. F4P 'F4P' video/mp4 Mídia protegida para Adobe Flash Player
. F4A 'F4A' video/mp4 Áudio para Adobe Flash Player
. F4B 'F4B' video/mp4 Audio Book para o Adobe Flash Player
. Flv
video / x-flv Flash Video

2.4. Elemento <s:VideoPlayer>

Esta é a tag

<s:VideoPlayer
Properties

autoDisplayFirstFrame="true"
autoPlay="true"
autoRewind="true"
loop="false"
muted="false"
pauseWhenHidden="true"
scaleMode="letterbox"
source=""
volume="1"
Events

bytesLoadedChange="No default"
complete="No default"
currentTimeChange="No default"
durationChange="No default"
mediaPlayerStateChange="No default"
Styles

alignmentBaseline="baseline"
baselineShift="0"
cffHinting="0.0"
color="0x000000"
digitCase="default"
digitWidth="default"
direction="ltr"
dominantBaseline="auto"
dropShadowVisible="true"
fontFamily="Arial"
fontLookup="device"
fontSize="12"
fontStyle="normal"
fontWeight="normal"
justificationRule="auto"
justificationStyle="auto"
kerning="false"
ligatureLevel="common"
lineHeight="120%"
lineThrough="false%"
locale="en"
renderingMode="cff"
textAlign="start"
textAlignLast="start"<p>jj</p>
textAlpha="1"
textDecoration="start"
textJustify="interWord"
trackingLeft="0"
trackingRight="00"
typographicCase="default"
/>

2.4. Exemplo de um Player

Arquivo: player1.mxml
1) Abra o FlashDevelop
2) Crie o arquivo MXML
Menu Fle > New > MXML Document > player1
3) Recorte e cole o código fonte baixo:

<?xml version="1.0" encoding="utf-8"?>
<!-- controls\VideoPlayer\VideoPlayerFMS.mxml -->

 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
     xmlns:s="library://ns.adobe.com/flex/spark"
     xmlns:mx="library://ns.adobe.com/flex/mx" >
     <s:layout>
         <s:VerticalLayout/>
     </s:layout>
   
     <s:VideoPlayer id="myPlayer"
         width="500" height="300">
         <s:source>
             <s:DynamicStreamingVideoSource id="mySVS" host="rtmp://127.0.0.1/vod/">
                 <s:DynamicStreamingVideoItem id="dreamgirl150" streamName="red5.flv" bitrate="150" />
                 <s:DynamicStreamingVideoItem id="dreamgirl500" streamName="red5.flv" bitrate="500" />
                 <s:DynamicStreamingVideoItem id="dreamgirl1000" streamName="red5.flv" bitrate="1000" />
             </s:DynamicStreamingVideoSource>
         </s:source>
     </s:VideoPlayer>

     <s:TextArea width="500" height="50"
         text="Please wait while the video loads..."/>
 </s:Application>

4) Compilação e execução:
Para que esta demostração funcione é necessário um arquivo de vídeo qualquer em
C:\red5\webapps\vod\streams\red5.flv
É necessário também iniciar o servidor Red 5.

Menu Tools > Flash Tools > Build Current File


2.5. Um player simples
Este exemplo mostra a reprodução de um vídeo no servidor WampServer que utiliza o protocolo http.
O Arquivo re5.flv esta localizado na pasta www do WampServer que deverá estar inicializado.

Arquivo: player2.mxml
<?xml version="1.0" encoding="utf-8"?>
 <!-- controls\videoplayer\VideoPlayerSimple.mxml-->
 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
     xmlns:s="library://ns.adobe.com/flex/spark"
     xmlns:mx="library://ns.adobe.com/flex/mx">
   
     <s:VideoPlayer
         source="http://127.0.0.1/red5.flv"
         width="350" height="250"
         loop="true"/>
 </s:Application>

Obs: o arquivo red5.flv está na pasta www do Wampserver (deve estar ligado), repare que o protocolo http faz parte do endereço desse arquivo.

3. Principio da conexão:

Instanciando um NetConnection:
nc = new NetConnection();
Conectando:
nc.connect("rtmp://localhost/servico");
Nova instancia do NetStream:
nsPub = new NetStream ( nc );
Adicionando a camera ao NetStream:
nsPub.attachCamera(Camera.getCamera());
Publica com o nome "teste":
nsPub.publish("teste");
Este é o principio básico de uma conexão, porém não necessariamente irá funcionar, pois ele tentará publicar antes que a conexão seja aceita pelo servidor.

4. O pacote flash.media
Contém classe para trabalhar com recursos multimídia, como som e vídeo.
Funções
 FunçãoDescrição
 scanHardwareForça uma nova verificação nos microfones e câmeras no sistema.

Classes
 ClasseDescrição
 AudioDecoderA classe AudioDecoder enumera os tipos do áudio multicanal que um sistema pode suportar.
 AudioPlaybackMode    A classe AudioPlaybackMode define constantes da propriedade audioPlaybackMode da classe SoundMixer.
 AVTagDataFornece informações sobre um ponto de sinalização de um período em um fluxo HLS.
 CameraUse a classe Camera para capturar vídeo da câmera do sistema cliente ou do dispositivo.
 CameraPosition    A classe CameraPosition define constantes para a propriedade position da classe Camera.
 CameraRoll    A classe CameraRoll permite acessar dados de imagem na biblioteca de mídia do sistema ou no "rolo da câmera". Suporte a perfil do AIR: este recurso é compatível com dispositivos móveis, mas sistemas operacionais para desktop e dispositivos AIR for TV não oferecem suporte para ele.
 CameraRollBrowseOptions    A classe CameraRollBrowseOptions define as opções de inicialização que podem ser usadas ao utilizar a API de câmera de rolo para abrir o Seletor de Imagem.
 CameraUI    A classe CameraUI permite capturar uma imagem estática ou vídeo usando o aplicativo de câmera padrão em um dispositivo.
 H264LevelA classe H264Level é uma lista de valores constantes usados na configuração do nível da classe H264VideoStreamSettings.
 H264ProfileA classe H264Profile é uma lista de valores constantes usados na configuração do perfil da classe H264VideoStreamSettings.
 H264VideoStreamSettingsA classe H264VideoStreamSettings permite especificar as configurações de compactação de vídeo para cada NetStream.
 ID3InfoA classe ID3Info contém propriedades que refletem metadados ID3.
 MediaPromise    A classe MediaPromise representa a promessa de entregar um objeto de mídia.
 MediaType    A classe MediaType enumera os tipos gerais de mídia que podem ser retornados por uma câmera.
 MicrophoneUse a classe Microphone para monitorar ou capturar áudio de um microfone.
 MicrophoneEnhancedModeA classe MicrophoneEnhancedMode é uma enumeração de valores de constantes usados na definição da propriedade mode da classe MicrophoneEnhancedOptions.
 MicrophoneEnhancedOptionsA classe MicrophoneEnhancedOptions fornece opções de configuração do áudio realçado (cancelamento do eco acústico).
 SoundA classe Sound permite trabalhar com o som em um aplicativo.
 SoundChannelA classe SoundChannel controla um som em um aplicativo.
 SoundCodecA classe SoundCodec é uma enumeração de valores constantes utilizados na definição da propriedade codec da classe Microphone.
 SoundLoaderContextA classe SoundLoaderContext fornece verificações de segurança para arquivos que carregam som.
 SoundMixerA classe SoundMixer contém propriedades e métodos estáticos para controle de som global no arquivo.
 SoundTransformA classe SoundTransform contém propriedades para volume e panorama.
 StageVideoO objeto StageVideo usa os recursos de aceleração por hardware do dispositivo, se disponíveis, para exibir vídeo ao vivo ou gravado em um aplicativo.
 StageVideoAvailabilityEsta classe define uma lista que indica se o vídeo de palco está disponível.
 StageVideoAvailabilityReasonEsta classe define uma lista que indica se o vídeo de palco está disponível.
 StageWebView    A classe StageWebView exibe conteúdo HTML em uma porta para exibição do palco.
 VideoA classe Video exibe vídeo ao vivo ou gravado em um aplicativo sem incorporar o vídeo no arquivo SWF.
 VideoCodecA classe VideoCodec é uma lista de valores constantes de codecs de vídeo suportados.
 VideoStatusEsta classe define uma enumeração que descreve os níveis possíveis de decodificação de vídeo.
 VideoStreamSettingsA classe VideoStreamSettings permite especificar as configurações de compactação de vídeo para cada NetStream
4.1. Classe Camera
Classe    public final class Camera
Herança    Camera  Inheritance EventDispatcher Inheritance Object
Versão da linguagem:     ActionScript 3.0
Versões de runtime:     AIR 1.0, Flash Player 9
Isso foi útil?Sim    Não

Use a classe Camera para capturar vídeo da câmera do sistema do cliente ou do dispositivo.
Use a classe Video para monitorar o vídeo localmente.
Use as classes NetConnection e NetStream para transmitir o vídeo para o Red5. O Red5 pode enviar o fluxo de vídeo para outros servidores e transmiti-lo para outros clientes que executam o Flash Player ou o AIR.

Uma instância de Camera captura o vídeo na proporção de paisagem. Em dispositivos que podem alterar a orientação da tela, como celulares, um objeto Video anexado à câmera mostrará somente o vídeo direito em uma orientação com proporção de paisagem. Assim, aplicativos móveis devem usar a orientação de paisagem ao exibir vídeo e não devem girar automaticamente.

No iOS, o vídeo da câmera dianteira é refletido. No Andróide, não.

Em dispositivos móveis com uma câmera com autofoco, o autofoco contínuo é ativado automaticamente. Se a câmera não oferecer suporte ao foco automático contínuo, e muitas câmeras de dispositivo móveis não o fazem, a câmera recebe o foco quando o objeto Camera é anexado a um fluxo de vídeo e sempre que o método setMode() é chamado. Nos computadores pessoais, o comportamento de autofoco é dependente do driver da câmera e das configurações.

Em um aplicativo do AIR no Android e no iOS, a câmera não irá capturar o vídeo enquanto um aplicativo do AIR não for o aplicativo ativo em primeiro plano. Além disso, as conexões de streaming poderão cair quando o aplicativo estiver em segundo plano. No iOS, o vídeo da câmera não poderá ser exibido quando um aplicativo usar o modo de renderização de GPU. O vídeo da câmera ainda pode ser transmitido para um servidor.

Suporte a perfil do AIR: não há suporte para este recurso em dispositivos AIR for TV. Consulte Suporte a perfil do AIR para obter mais informações sobre o suporte de API através de múltiplos perfis. Observe que, para dispositivos AIR for TV, Camera.isSupported é true, mas Camera.getCamera() sempre retorna null. Não há suporte ao acesso à câmara em navegadores móveis.

Para obter informações sobre a captura de áudio, consulte a classe Microphone.

Importante: o runtime exibe uma caixa de diálogo Privacidade que permite que o usuário escolha entre permitir ou negar acesso à câmera. O tamanho da janela do aplicativo deve ter, pelo menos, 215 x 138 pixels; este é o tamanho mínimo necessário para que a caixa de diálogo seja exibida.

Para criar ou fazer referência a um objeto Camera, use o método getCamera().

O exemplo a seguir mostra a imagem de uma câmera depois de reconhecer a advertência de segurança. O Palco foi configurado de forma que não possa ser escalonado e esteja alinhado no canto superior esquerdo da janela do player. O evento activity foi enviado no início e no final (se houver) da sessão e foi capturado pelo método activityHandler(), que imprime as informações sobre o evento.
Observação: é necessário acoplar uma câmera ao seu computador para que este exemplo funcione corretamente.

Arquivo: CameraExample.as
package {
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Video;

    public class CameraExample extends Sprite {
        private var video:Video;
       
        public function CameraExample() {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
           
            var camera:Camera = Camera.getCamera();
           
            if (camera != null) {
                camera.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
                video = new Video(camera.width * 2, camera.height * 2);
                video.attachCamera(camera);
                addChild(video);
            } else {
                trace("You need a camera.");
            }
        }
       
        private function activityHandler(event:ActivityEvent):void {
            trace("activityHandler: " + event);
        }
    }
}

Resultado:

4.2. Classe Video

A classe Video exibe vídeo ao vivo ou gravado em um aplicativo sem incorporar o vídeo no arquivo SWF. Esta classe cria um objeto Video que reproduz qualquer um dos seguintes tipos do vídeo: arquivos de vídeo gravados armazenados em um servidor ou localmente, ou vídeo ao vivo capturado pelo usuário. Um objeto Video é um objeto na lista de exibição do aplicativo e representa o espaço visual no qual o vídeo é executado em uma interface de usuário.
Quando usado com o Flash Media Server ou no Red5, o objeto Video permite enviar vídeo ao vivo capturado por um usuário para o servidor e depois transmiti-lo do servidor para outros usuários. Usando esses recursos, você pode desenvolver aplicativos de mídia, tais como um player de vídeo simples, um player de vídeo com publicação de múltiplos pontos de um servidor para outro, ou um aplicativo de compartilhamento de vídeo para uma comunidade de usuários.

O Flash Player 9 e posterior suporta a publicação e a reprodução de arquivos FLV codificados com o codec Sorenson Spark ou On2 VP6 e também suporta um canal alfa. O codex de vídeo On2 VP6 usa menos largura de banda do que as tecnologias mais antigas e oferece filtros adicionais de desbloqueio e deringing. Consulte a classe flash.net.NetStream para obter mais informações sobre a reprodução de vídeo e os formatos com suporte.

O Flash Player 9.0.115.0 e versões posteriores suportam mipmapping para otimizar a qualidade de renderização do runtime. Para a reprodução de vídeo, o Flash Player usa a otimização do mapeamento mip se você definir a propriedade smoothing do objeto Video como true.

Como ocorre com outros objetos na lista de exibição, você pode controlar várias propriedades dos objetos Video. Por exemplo, é possível mover o objeto Video ao redor do Palco usando as propriedades x e y, alterar o tamanho usando as propriedades height e width, e assim por diante.

Para reproduzir um fluxo de vídeo, use attachCamera() ou attachNetStream() para anexar o vídeo ao objeto Video. Assim, adicione o objeto Video à lista de exibição usando addChild().

Observação: a classe Video não é uma subclasse da classe InteractiveObject, por isso não pode enviar os eventos de mouse. No entanto, você pode chamar o método addEventListener() no container do objeto de exibição que contém o objeto Video.

O exemplo a seguir usa um objeto Video com as classes NetConnection e NetStream para carregar e reproduzir um arquivo FLV. Para executar esse exemplo, você precisa de um arquivo FLV cujo nome e local correspondem à variável transmitida para videoURL; nesse caso, um arquivo FLV chamado red5.flv que se encontra no mesmo diretório que o arquivo SWF.
Nesse exemplo, o código que cria os objetos Video e NetStream e chama Video.attachNetStream() e NetStream.play() é colocado em uma função de manipulador. O manipulador é chamado apenas se a tentativa de se conectar a um objeto NetConnection for bem-sucedida, e isso se dá quando o evento netStatus retornar um objeto info com uma propriedade code que indica sucesso. Recomenda-se aguardar uma conexão bem-sucedida antes de chamar NetStream.play().

Arquivo: VideoExample.as
 package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;

    public class VideoExample extends Sprite {
        private var videoURL:String = "http://127.0.0.1/red5.flv";
        private var connection:NetConnection;
        private var stream:NetStream;

        public function VideoExample() {
            connection = new NetConnection();
            connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            connection.connect(null);
        }

        private function netStatusHandler(event:NetStatusEvent):void {
            switch (event.info.code) {
                case "NetConnection.Connect.Success":
                    connectStream();
                    break;
                case "NetStream.Play.StreamNotFound":
                    trace("Unable to locate video: " + videoURL);
                    break;
            }
        }

        private function connectStream():void {
            stream = new NetStream(connection);
            stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
            var video:Video = new Video();
            video.attachNetStream(stream);
            stream.play(videoURL);
            addChild(video);
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
            trace("securityErrorHandler: " + event);
        }
       
        private function asyncErrorHandler(event:AsyncErrorEvent):void {
            // ignore AsyncErrorEvent events.
        }
    }
 }
Obs: o arquivo red5.flv está na pasta www do Wampserver (deve estar ligado), repare que o protocolo http faz parte do endereço desse arquivo.


Propriedades públicas
 PropriedadeDefinido por
  deblocking : int
Indica o tipo de filtro aplicado ao vídeo decodificado como parte do pós-processamento.
Video
  smoothing : Boolean
Especifica se o vídeo deve ser suavizado (interpolado) ao ser dimensionado.
Video
  videoHeight : int
[somente leitura] Um número inteiro que especifica a altura do fluxo de vídeo, em pixels.
Video
  videoWidth : int
[somente leitura] Um número inteiro que especifica a largura do fluxo de vídeo, em pixels.
Video

Métodos públicos
 MétodoDefinido por
  
Video(width:int = 320, height:int = 240)
Cria uma nova ocorrência de Video.
Video
  
Especifica um fluxo de vídeo a partir de uma câmera a ser exibido dentro dos limites do objeto Video no aplicativo.
Video
  
Especifica um fluxo de vídeo a ser exibido dentro dos limites do objeto Video no aplicativo.
Video
  

4.3. Trabalhando com câmeras
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 criado no ActionScript para trabalhar com um computador ou dispositivo de câmera.

Nos dispositivos móveis, você também pode usar a classe CameraUI. A classe CameraUI ativa um aplicativo de câmera para permitir que o usuário capture uma tomada de imagem ou de vídeo. Quando o usuário terminar, seu aplicativo poderá acessar a imagem ou o vídeo por meio de um objeto MediaPromise.

Noções básicas sobre a classe Camera

O 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:
Quais câmeras instaladas no computador ou dispositivo do usuário estão disponíveis.
Se há uma câmera instalada
Se o Flash Player tem acesso à câmera do usuário ou não.
Qual câmera está ativa.
A largura e a altura do vídeo que está sendo capturado.

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 tela
A 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âmera
Ao criar um aplicativo que se conecta à câmera de um usuário, considere os seguintes aspectos no seu código:
Verifique se o usuário tem uma câmera instalada. Trate o caso em que não há nenhuma câmera disponível.
Somente no Flash Player, verifique se o usuário permitiu acesso à câmera explicitamente. Por motivo de segurança, o player exibe a caixa de diálogo Configurações do Flash Player, onde o usuário pode conceder ou negar acesso à sua câmera. Isso impede que o Flash Player se conecte à câmera de um usuário e transmita um fluxo de vídeo sem a devida permissão. Se um usuário clicar em permitir, o aplicativo poderá se conectar à câmera. Se ele clicar em negar, o aplicativo não conseguirá ter acesso à câmera do usuário. Seus aplicativos sempre devem manipular os dois casos normalmente.
Somente para o AIR, verifique se a classe Camera conta com o suporte dos perfis de dispositivo compatíveis com seu aplicativo.
A classe Camera não conta com suporte em navegadores móveis.
A classe Camera não conta com suporte em aplicativos AIR móveis que usam o modo de renderização pela GPU.
Em dispositivos móveis, somente uma câmera pode ficar ativa de cada vez.

Conexão à câmera de um usuário
A 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âmeras
Antes 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:
- Verifique a propriedade estática Camera.names que contém uma matriz de nomes de câmeras que estão disponíveis. Normalmente, essa matriz terá no máximo uma string, porque é provável que a maioria dos usuários não tenha mais de uma câmera instalada. Este código demonstra como verificar a propriedade Camera.names para saber se o usuário tem alguma câmera disponível:

if (Camera.names.length > 0)
{
    trace("User has at least one camera installed.");
    var cam:Camera = Camera.getCamera(); // Get default camera.
}
else
{
    trace("User has no cameras installed.");
}

- Verifique o valor de retorno do método estático Camera.getCamera(). Se não houver nenhuma câmera disponível ou instalada, o método retornará null; caso contrário, ele retornará uma referência a um objeto Camera. Este código demonstra como verificar o método Camera.getCamera() para saber se o usuário tem alguma câmera disponível:
var cam:Camera = Camera.getCamera();
if (cam == null)
{
    trace("User has no cameras installed.");
}
else
{
    trace("User has at least 1 camera installed.");
}

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);
}

Câmeras de dispositivos móveis
A classe Camera não é suportada no tempo de execução do Flash Player em navegadores móveis.

Nos aplicativos AIR em dispositivos móveis você pode acessar a câmera ou câmeras no dispositivo. Em dispositivos móveis, você pode usar tanto a câmera frontal quanto a câmera traseira, mas somente uma saída de câmera pode ser exibida em um determinado momento. (Conectar uma segunda câmera desconecta a primeira.) A câmera frontal está refletida horizontalmente no iOS; no Android, não está.

Detecção de permissões de acesso à câmera
Na caixa de proteção do aplicativo do 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:

O parâmetro event da função statusHandler() contém uma propriedade de código que inclui a string “Camera.Muted” ou “Camera.Unmuted”. Se o valor é “Camera.Muted”, isso significa que o usuário clicou no botão Negar e o Flash Player não pode acessar a câmera. Este snippet mostra um exemplo disso:
function statusHandler(event:StatusEvent):void
{
    switch (event.code)
    {
        case "Camera.Muted":
            trace("User clicked Deny.");
            break;
        case "Camera.Unmuted":
            trace("User clicked Accept.");
            break;
    }
}

A classe Camera contém uma propriedade somente leitura chamada muted que especifica se o usuário negou acesso à câmera (true) ou se permitiu acesso a ela (false) no painel Privacidade do Flash Player. Este snippet mostra um exemplo disso:
function statusHandler(event:StatusEvent):void
{
    if (cam.muted)
    {
        trace("User clicked Deny.");
    }
    else
    {
        trace("User clicked Accept.");
    }
}

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.

Maximizando a qualidade de vídeo da câmera
Por 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.

Monitorando o status da câmera
A 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.

5. Pacote flash.net
O pacote flash.net contém classes para enviar e receber los UMA Rede.



Funções
 FunçãoDESCRIÇÃO
 getClassByAliasProcura uma classe que tenha um alias Registrado atraves de uma Chamada ao método registerClassAlias ​().
 navigateToURLAbre UO substitui UMA Janela nenhum aplicativo Opaco Contém o conteiner não Flash Player (geralmente hum Navegador).
 registerClassAliasPreserva a classe (tipo) de hum Objeto QUANDO ESSE Objeto E codificado AMF em (Action Message Format).
 sendToURLEnvia UMA solicitação de URL a hum Servidor, mas Ignora QUALQUÉR RESPOSTA.

Classes
 ClasseDESCRIÇÃO
 DatagramSocket    A classe DatagramSocket Ativa o Código de para enviar e receber pacotes de Protocolo de Datagrama Universal (UDP).
 FileFilterA classe FileFilter E USADA parágrafo INDICAR cais Quais d'Orsay Arquivos nenhum Sistema Favoritos Looks Favoritos São mostrados na Caixa de Diálogo de Navegação de Arquivos, exibida QUANDO OS MÉTODOS FileReference.browse (), FileReferenceList.browse () São chamados OU QUANDO UM Método de Pesquisa de hum Objeto File, FileReference UO FileReferenceList E Chamado.
 FileReferenceA classe FileReference fornece hum Meio de CARREGAR e Baixar Arquivos Entre o computador de hum hum Looks Favoritos e Servidor.
 FileReferenceListA classe FileReferenceList fornece hum Meio de permitir Opaco OS USUÁRIOS selecionem hum UO Mais Arquivos de upload para.
 GroupSpecifierA classe GroupSpecifier E USADA parágrafo Construir como cordas de groupspec opacas Opaco PODEM serviços Passadas parágrafo Construtores NetStream e NetGroup.
 InterfaceAddress    A informação classe InterfaceAddress como PROPRIEDADES de hum ENDEREÇO ​​de Interface de Rede.
 IPVersion    A classe IPVersion definir Constantes Opaco representam como DIVERSAS FAMÍLIAS de Endereços IP.
 LocalConnectionA classe LocalConnection permite Opaco Você. CRIE UM Objeto LocalConnection Que Chama hum Método los Outro Objeto LocalConnection.
 NetConnectionA classe NetConnection cria uma Conexão bidirecional Entre um Cliente e um Servidor.
 NetGroupComo instâncias da classe NetGroup representam uma Participação em um Grupo RTMFP.
 NetGroupInfoA classe NetGroupInfo Específica DIVERSAS estatisticas de Qualidade DO SERVIÇO (QoS) relacionadas AO Transporte de Dados Ponto a Ponto RTMFP subjacente de hum Objeto NetGroup.
 NetGroupReceiveModeA classe NetGroupReceiveMode E UMA Lista de Valores Constantes Usados ​​parágrafo a Propriedade receiveMode da classe NetGroup.
 NetGroupReplicationStrategyA classe NetGroupReplicationStrategy E UMA Enumeração de Valores Constantes utilizados na Definição da Propriedade replicationStrategy da classe NetGroup.
 NetGroupSendModeA classe NetGroupSendMode E UMA Lista de Valores Constantes USADA par o Parâmetro sendMode fazer metodo NetGroup.sendToNeighbor ().
 NetGroupSendResultA classe NetGroupSendResult E UMA listaA de Valores Constantes Usados ​​Para O Valor de retorno DOS Métodos de Roteamento direcionados Associados um UMA Instancia NetGroup.
 NetMonitorA Mantem UMA classe NetMonitor Lista de Objetos de NetStream.
 NetStreamA classe NetStream abre um canal de Fluxo de UMA via sobre UMA NetConnection.
 NetStreamAppendBytesActionA classe NetStreamAppendBytesAction E UMA Enumeração das Constantes Opaco Você. PODE enviar par o Método NetStream.appendBytesAction ().
 NetStreamInfoA classe NetStreamInfo Específica como varias estatisticas de Qualidade de Serviço (QoS) e OUTRAS Informations relacionadas AO Objeto NetStream e AO tampão de Fluxo subjacente parágrafo Áudio, Vídeo e Dados.
 NetStreamMulticastInfoA classe NetStreamMulticastInfo Específica varias estatisticas de Qualidade DO SERVIÇO (QoS) relacionadas AO Transporte de Fluxo Contínuo RTMFP Localidade: Não hierárquico e multicast de IP subjacente de hum Objeto de Netstream.
 NetStreamPlayOptionsA NetStreamPlayOptions Classe Específica como varias opções Opaco PODEM serviços Passadas parágrafo o Método NetStream.play2.
 NetStreamPlayTransitionsA NetStreamPlayTransitions Classe Específica como strings validAS Opaco PODEM serviços USADAS com um Propriedade NetStreamPlayOptions.transition.
 NetworkInfo    A classe NetworkInfo fornece Informations sobre como interfaces de Rede sem computador.
 NetworkInterface    A classe NetworkInterface descreve UMA Interface de Rede.
 ObjectEncodingA classe ObjectEncoding E USADA NAS configurações de serialização de Definição Objetos aulas EM Opaco serializam (FileStream como, NetStream, NetConnection, SharedObject e ByteArray) de para funcionar com versões Anteriores fazer ActionScript.
 ResponderA classe fornece Responder hum Objeto that E USADO los NetConnection.call () parágrafo Manipular Valores de Retorno fazer Relacionados Servidor AO Êxito UO à falha de Operações Específicas.
 SecureSocketA classe SecureSocket Ativa o Código parágrafo Fazer Conexões com Soquete utilizando OS Protocolos Camada de SOQUETES Segura (SSL) e Segurança de Camada de Transporte (TLS).
 ServerSocket    A classe ServerSocket permite Que o Código ATUE Como hum Servidor parágrafo Conexões TCP (Protocolo de Controle de Transporte).
 SharedObjectA classe SharedObject E USADA parágrafo Ler e armazenar quantidades Limitadas de Dados nenhum computador de hum Looks Favoritos UO los hum Servidor.
 SharedObjectFlushStatusA classe SharedObjectFlushStatus fornece Valores de para o Código de Retornado UMA Chamada Para O Método SharedObject.flush ().
 SoqueteA classe Soquete Ativa o Código de para estabelecer Conexões de Soquete fazer Protocolo de Controle de Transporte (TCP) de para enviar e receber Dados binarios.
 URLLoaderA classe URLLoader baixa Dados de URL UMA Texto como, Dados binarios UO Variáveis ​​codificadas los URL.
 URLLoaderDataFormatA Classe URLLoaderDataFormat fornece Valores Que da especificam Como OS DADOS baixados São recebidos.
 URLRequestA classe URLRequest Captura Todas como Informations los UMA Única solicitação HTTP.
 URLRequestDefaults    A classe URLRequestDefaults inclui PROPRIEDADES estáticas Opaco PODEM serviços configuradas parágrafo Definir OS Valores Padrão das PROPRIEDADES da classe URLRequest.
 URLRequestHeaderUm Objeto URLRequestHeader encapsulamento hum Único Cabeçalho de solicitação HTTP e Consiste los hum par de Nome / valor.
 URLRequestMethodA classe URLRequestMethod fornece Valores Opaco especificam se o Objeto URLRequest DEVE USAR o metodo POST UO GET AO enviar Dados um hum Servidor.
 URLStreamA classe URLStream fornece Acesso de Baixo do Nível de URLs de download.
 URLVariablesA classe URLVariables permite transferir Variáveis ​​Entre um aplicativo e Servidor.
 XMLSocketA implementação classe XMLSocket SOQUETES de Cliente Que permitem uma Comunicação que aplicativo Flash Player UO AIR com hum computador de Servidor identificado POR UM ENDEREÇO ​​IP UO Nome de Domínio.

5.1. Classe NetConnection
A classe NetConnection cria uma conexão bidirecional entre um cliente e um servidor. O cliente pode ser um aplicativo Flash Player ou AIR. O servidor pode ser um servidor web, Flash Media Server, um servidor de aplicativos executando o Flash Remoting ou o serviço Adobe Stratus. Chame NetConnection.connect() para estabelecer a conexão. Use a classe NetStream para enviar fluxos de mídia e dados pela conexão.
Para obter informações de segurança sobre o carregamento de conteúdo e dados no Flash Player e no AIR, consulte:

Para carregar conteúdo e dados no Flash Player a partir de um servidor web ou de um ponto local, consulte Centro do Desenvolvedor do Flash Player: Segurança.
Para carregar conteúdo no Flash Player e no AIR a partir do Flash Media Server, consulte a documentação do Flash Media Server.
Para carregar conteúdo e dados no AIR, consulte o Centro do Desenvolvedor do Adobe AIR.
Para gravar métodos de retorno de chamada para esta classe, você pode estendê-la e definir esses métodos na subclasse ou usar a propriedade client para fazer referência a um objeto e definir os métodos de retorno de chamada nesse objeto.

O exemplo a seguir usa um objeto Video com as classes NetConnection e NetStream para carregar e reproduzir um arquivo FLV.
Nesse exemplo, o código que cria os objetos Video e NetStream e chama os métodos Video.attachNetStream() e NetStream.play() é inserido em uma função de manipulador. O manipulador apenas será chamado se uma tentativa de conexão com o objeto NetConnection for bem-sucedida; ou seja, quando o evento netStatus retorna um objeto info com uma propriedade code que indica êxito. Convém aguardar uma conexão bem-sucedida antes de chamar NetStream.play().

Arquivo: NetConnectionExample.as
package {
    import flash.display.Sprite;
    import flash.events.NetStatusEvent;
    import flash.events.SecurityErrorEvent;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.events.Event;

    public class NetConnectionExample extends Sprite {
        private var videoURL:String = "http://localhost/red5.flv";
        private var connection:NetConnection;
        private var stream:NetStream;
        private var video:Video = new Video();       

        public function NetConnectionExample() {
            connection = new NetConnection();
            connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            connection.connect(null);
        }

        private function netStatusHandler(event:NetStatusEvent):void {
            switch (event.info.code) {
                case "NetConnection.Connect.Success":
                    connectStream();
                    break;
                case "NetStream.Play.StreamNotFound":
                    trace("Stream not found: " + videoURL);
                    break;
            }
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
            trace("securityErrorHandler: " + event);
        }

        private function connectStream():void {
            addChild(video);
            var stream:NetStream = new NetStream(connection);
            stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
            stream.client = new CustomClient();
            video.attachNetStream(stream);
            stream.play(videoURL);
        }
    }
}

class CustomClient {
    public function onMetaData(info:Object):void {
        trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
    }
    public function onCuePoint(info:Object):void {
        trace("cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
    }
}

Obs: o arquivo red5.flv está na pasta www do Wampserver (deve estar ligado), repare que o protocolo http faz parte do endereço desse arquivo.

Envio de vídeo para um servidor
Para reproduzir arquivos em fluxo contínuo no Flash Media Server, você pode usar as classes NetConnection e NetStream para se conectar a uma ocorrência do servidor remoto e reproduzir um fluxo especificado. Para especificar um servidor RTMP (Real-Time Messaging Protocol), passe a URL RTMP desejada, como “rtmp://localhost/appName/appInstance”, para o método NetConnection.connect() em vez de passar null. Para reproduzir um determinado fluxo ao vivo ou gravado do Flash Media Server, passe um nome de identificação referente aos dados ao vivo publicados por NetStream.publish() ou um nome de arquivo gravado para reprodução ao método NetStream.play().

Envio de vídeo para um servidor

Após a conecção com o servidor Flash, Flex, Air através da classe NetConnect utiliza-se a classe NetStream para fazer a comunicação, um canal de streaming em tempo real é criado, onde pode-se anexar uma classe do tipo Camera para transmitir um webcam ou qualquer outro dispositivo de vídeo, como a classe Microphone para transmitir o áudio do microfone.
Utilizar-se o método publish( ) para publicar áudio, vídeo e dados ou um play( ) para receber esta publicação ou rodar arquivos de vídeos.

5.2. Classe NetStream
Abre um canal de fluxo de uma via sobre uma NetConnection.

Use a classe NetStream para fazer o seguinte:
 NetStream.play() para reproduzir um arquivo de mídia a partir de um disco local, de um servidor web ou do Flash Media Server ou Red5.
NetStream.publish() para publicar vídeo, áudio e fluxo de dados para o Flash Media Server ou Red5.
NetStream.send() para enviar mensagens a todos os clientes assinantes.
NetStream.send() para adicionar metadados a um fluxo ao vivo.
NetStream.appendBytes() para enviar dados ByteArray para o NetStream.

Nota: você não pode reproduzir e publicar um fluxo contínuo no mesmo objeto NetStream.
Métodos públicos
 MétodoDefinido por
  
NetStream(connection:NetConnection, peerID:String = "connectToFMS")
Cria um fluxo que você pode usar para reproduzir arquivos de mídia e enviar dados por um objeto NetConnection.
Cria um canal de streaming sobre a instância do NetConnection conectado ao servidor Flash Media.
Criação da instância do NetStream:
var ns:NetStream = new NetStream(nc), sendo que nc é a instância de NetConnection.
NetStream
  
Transmite uma ByteArray para um NetStream para executar uma reprodução.
NetStream
  
appendBytesAction(netStreamAppendBytesAction:String):void
Indica uma descontinuidade de escala de tempo, limpa o FIFO e instrui o analisador de bytes a esperar o cabeçalho do arquivo ou o início de uma marca FLV.
NetStream
  
Anexa um fluxo contínuo a um novo objeto NetConnection.
NetStream
  
Anexa um fluxo de áudio a um objeto NetStream a partir de um objeto Microphone transmitido como a origem.
NetStream
  
attachCamera(theCamera:Camera, snapshotMilliseconds:int = -1):void
Inicia a captura de vídeo a partir da câmera ou para a captura quando  a Camera está definido como "null".
O primeiro parâmetro recebe a instância da classe Camera; e o segundo parâmetro passado é do tipo inteiro, que permite tirar snapshots em x em x tempo, os valores são em milissegundos, onde 1000 = 1 segundo. O segundo parâmetro pode ser omitido, enviando assim o sinal da câmera configurado por default ou pela aplicação.
NetStream
  
Para a reprodução de todos os dados no fluxo, define a propriedade "time" como 0 e disponibiliza o fluxo para outro uso. Finaliza o streaming pelo canal do NetStream aberto, fechando assim a publicação ou o play.
NetStream
  
As versões de todos os recursos são mantidas pelo objeto NetStream.
NetStream
  
Chamado sempre que um fluxo de publicação de mesmo nível corresponder a um fluxo de assinatura de mesmo nível.
NetStream
  
Pausa a reprodução de um fluxo de vídeo.
NetStream
  
play(... arguments):void
Reproduz um arquivo de mídia a partir de um diretório local ou de um servidor web; executa um arquivo de mídia ou um fluxo ao vivo a partir do Flash Media Server.
Assim como publish, que publica o áudio e vídeo, o método play é de suma importância, pois com ele podemos criar um playback de ídeos gravados nos vários formatos suportados pelo Flash Media, ou criar o playback de publicações ao vivo. O primeiro parâmetro é o nome do arquivo de vídeo ou nome da publicação, já os outros parâmetros dizem a partir de qual ponto do vídeo se quer iniciar e finalizar o mesmo
NetStream
  
Alterna perfeitamente entre arquivos com diversas taxas de bits e permite que um NetStream retome quando uma conexão é perdida e reconectada.
NetStream
  
Extrai os metadados DRM de um arquivo de mídia armazenado localmente.
NetStream
  
publish(name:String = null, type:String = null):void
Envia fluxo contínuo de áudio, vídeo e mensagens de texto de um cliente para o Flash Media Server, opcionalmente gravando o fluxo contínuo durante a transmissão.
NetStream
  
Especifica se o áudio de entrada é reproduzido no fluxo.
NetStream
  
Especifica se o vídeo recebido é reproduzido no fluxo.
NetStream
  
Especifica a taxa de quadros do vídeo recebido.
NetStream
  
[estático] Em aplicativos AIR, isso exclui todos os dados do comprovante do gerenciamento de direitos digitais (DRM) armazenados localmente.
NetStream
  
Reinicia a reprodução de um fluxo de vídeo pausado.
NetStream
  
seek(offset:Number):void
Busca o quadro-chave (também chamado de quadro em I na indústria de vídeo) mais próximo à localização especificada.
NetStream
  
send(handlerName:String, ... arguments):void
Envia uma mensagem em um fluxo publicado a todos os clientes assinantes.
NetStream
  
Define as credenciais de autenticação DRM necessárias para visualização do conteúdo
NetStream
  
step(frames:int):void
As etapas avançam ou voltam o número especificado de quadros, relativo ao quadro atualmente exibido.
NetStream
  
Pausa ou reinicia a reprodução de um fluxo.
NetStream

5.2.1. Método publish()  
public function publish(name:String = null, type:String = null):void
 
Você pode gravar arquivos em formato FLV ou MPEG-4. Se você gravar um arquivo no formato MPEG-4, você deve usar uma ferramenta para editar ou reproduzir o arquivo em outro aplicativo.

Não use este método para reproduzir um fluxo que já foi publicado e registrado. Para reproduzir um fluxo, chame o método NetStream.play ().
var subscribeNS:NetStream = new NetStream(myNetConnection);
subscribeNS.play("streamToPlay");

Quando o Flash Media Server registra um fluxo que cria um arquivo e armazena-lo em um subdiretório no diretório do aplicativo no servidor. Cada fluxo é armazenado em um diretório cujo nome corresponde ao nome da instância do aplicativo passado para NetConnection.connect () . O servidor cria esses diretórios automaticamente.
Por exemplo, o código a seguir se conecta ao aplicativo "lectureseries" e registra um fluxo chamado de "palestra". O arquivo "lecture.flv" é gravada no arquivo/lectureseries/streams /monday:

var myNC:NetConnection = new NetConnection();
myNC.connect("rtmp://fms.example.com/lectureseries/monday");
var myNS:NetStream = new NetStream(myNC);
myNS.publish("lecture", "record");


Este método despacha um NetStatusEvent objeto. Por exemplo, se alguém já está publicando uma corrente com o nome especificado o NetStatusEvent objeto é despachado com um código de propriedade de "NetStream.Publish.BadName" . Para mais informações, consulte o NetStatusEvent objeto.

Parâmetros

Nome : String (default = nulo )- Uma string que identifica o fluxo. Os clientes que subscrevem este fluxo deve passar este mesmo nome quando chamam NetStream.play () . Não siga o nome do fluxo com uma "/". Por exemplo, não use o nome do fluxo "bolero /" .
Pode publicar ficheiros nos formatos descritos na tabela a seguir. A sintaxe é diferente dependendo do formato de arquivo.
Formato de arquivoSintaxeExemplo
FLVEspecifique o nome do fluxo como uma string, sem uma extensão de nome de arquivo.ns.publish ("myflvstream");
MP3 ou ID3Especifique o nome do fluxo como uma string com prefixo mp3: ou id3: e sem uma extensão de nome de arquivo.ns.publish ("mp3: mymp3stream"); ​​ns.publish ("id3: myid3data");
Arquivos com base em MPEG-4 (como F4V e MP4)Especifique o nome do fluxo como uma string com o prefixo mp4: com ou sem a extensão de arquivo. O prefixo indica ao servidor que o arquivo contém vídeo H.264 codificado e áudio codificado em AAC dentro da Parte 14 formato MPEG-4 recipiente.ns.publish ("mp4: myvideo.f4v") ns.publish ("mp4: myvideo.mp4"); ns.publish ("mp4: MyVideo");

O método publish é responsável por todo streaming de áudio e vídeo ao vivo. É através deste método que será enviado um nome único para o Flash Media para que os outros clientes se conectem a este canal. O seu fluxo de trabalho é bem simples de entender.
O método pode receber dois parâmetros: o primeiro é o nome da publicação, e o segundo diz como será enviada esta publicação. Existem três formas de enviar:
1ª. Se for passado record como parâmetro, a publicação será gravada no servidor em um arquivo FLV. Será gravado em um subdiretório criado automaticamente ao receber a primeira gravação. Se o arquivo existir, ele será substituído.
2ª. Se for passado append no segundo parâmetro, a publicação será transmitida ao vivo e gravada ao mesmo tempo. Se nenhum arquivo correspondente ao nome de parâmetro for encontrado, ele é criado.
3ª. Se for passado live, a aplicação vai apenas publicar ao vivo seu áudio e vídeo.
Se o segundo parâmetro for omitido, por default é live.
Se um arquivo com um nome que corresponde ao valor passado para o nome de parâmetro existe, ele será excluído.

6. Webcam
O exemplo a seguir mostra como você pode exibir alimentação webcam de um usuário em um controle VideoDisplay usando o estático Camera.getCamera() método e do VideoDisplay classe attachCamera() método.

Exemplo:
Como capturar a imagem da WebCam, e salvar no disco

1) Abra o FlashDevelop
2) Crie o arquivo MXML
Nenu Fle > New > MXML Document > webcam2009
3) Recorte e cole o código fonte baixo:

Arquivo: webcam2009.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
                   minWidth="300" minHeight="350">


<s:creationComplete>
    <![CDATA[

    //cam é a instância de sua WebCam
    //Geralmente surge uma mensagem de permissão ao usuário
    var cam:Camera = Camera.getCamera();

    // Aqui inserimos a instância da câmera no
    // componente VideoDisplay
    webcam.attachCamera(cam);

    ]]>
</s:creationComplete>

<mx:VideoDisplay id="webcam"
     width="320" height="240"
     top="10"
     left="10"
                 />

<s:Button id="salvar" label="Salvar"
          top="250"
          left="10">
    <s:click>
        <![CDATA[
        import mx.graphics.ImageSnapshot;
        import mx.graphics.codec.JPEGEncoder;

        //Primeiro criamos a imagem Bitmap da câmera
        var imageBitmapData:BitmapData;
                imageBitmapData= ImageSnapshot.captureBitmapData(webcam);

        //Depois transformamos essa imagem em bytecodes
        var encoder:JPEGEncoder = new JPEGEncoder();
        var rawBytes:ByteArray = encoder.encode(imageBitmapData);

        //FileReference é usado para salvar a imagem no disco
        new FileReference().save(rawBytes,"mome.jpg");

        ]]>
    </s:click>
</s:Button>

</s:Application>

4) Compilação e execução:
Menu Tools > Flash Tools > Build Current File

5) Incorporação do arquivo webcam2009.swf nesta página:
Adicione o código abaixo no corpo da página para o teste em tempo real. Observe que o arquivo webcam2009.swf foi criado com a compilação do arquivo webcam2009.mxml.
...
<body>
<object data="swf\webcam2009.swf" type="application/x-shockwave-flash" height="300" width="300">
  <param value="swf\webcam2009.swf" name="movie">
  <param value="transparent" name="wmode">
</object>
</body>
...


FireFox
Não apresentou erro. As vezes ocorre erro no GoogleChrome, abrindo um tela preta, esse erro passa para o Flash Player, ao abrir novamento no FireFox o erro desaparece, ficando as vezes apenas no GoogleChrome.

GoogleChorme
Problema ao acessar a webcam com o Google Chrome
Há um novo problema ao usar o Flash no Chrome. Pode acontecer que a webcam não pode ser exibida mesmo se você permitir o acesso em Flash. Estamos percebendo o problema com o Chrome versão 28.0.1500.72 quando usando o Flash versão 11.8.800.97 (embora possa afetar outras versões também). O problema é que o Chrome agora exige que permite o acesso duas vezes para a webcam: uma vez no aplicativo Flash (assim, no Nimbb Player) e uma vez em uma mensagem abaixo da barra de URL do navegador. A segunda mensagem não é muito visível, tornando-o fácil de perder. Se o usuário de alguma forma, clica em "Deny" na segunda mensagem, então ele não será capaz de acessar a webcam, a menos que ir para as configurações do Chrome para resolver isso. Para resolver o problema, siga os seguintes passos: - Abra o Chrome - Abra o URL " chrome :/ / settings / "(ou no menu, clique em Configurações) - Na parte inferior da página, clique em "Mostrar configurações avançadas ..." - Na seção Privacidade, clique em "Configurações de conteúdo ..." - Na seção Mídia , clique em "Gerenciar exceções" - Na lista, certifique-se de que a URL "nimbb.com" não é negado. Se for, clique no pequeno "X" para remover a entrada da lista. Se você não vê a entrada, é bom. Clique em OK para fechar a janela. - Fechar Chrome e reabri-la. - Abrir http://nimbb.com/Video/Record.aspx - Sobre a aplicação Nimbb, clique em "Permitir" - A segunda mensagem é então exibida na parte superior da página (abaixo da barra de URL). Clique em "Permitir" lá. -. A webcam agora trabalha Este é um conhecido bug no Chrome.

Exemplo:

<?xml version= "1.0" encoding= "utf-8"?>
 <!-- http://blog.flexexamples.com/2008/01/22/displaying-a-webcams-video-in-a-flex-videodisplay-control/ -->
 <mx:Application name= "VideoDisplay_attachCamera_test"
  xmlns:mx= "http://www.adobe.com/2006/mxml"
  layout= "vertical"
  verticalAlign= "middle"
  backgroundColor= "white">

     <mx:Script>
  <![CDATA[
  import mx.controls.Alert;

  private function videoDisplay_creationComplete():void {
  var camera:Camera = Camera.getCamera();
  if (camera) {
  videoDisplay.attachCamera(camera);
  } else {
  Alert.show("You don't seem to have a camera.");
  }
  }
  ]]>
  </mx:Script>

     <mx:VideoDisplay id= "videoDisplay"
  creationComplete= "videoDisplay_creationComplete();"
  width= "160"
  height= "120"/>

     <mx:Button id= "button"
  label= "Reload Camera"
  click= "videoDisplay_creationComplete();"/>

 </mx:Application>
 
Compilação:
c:\projetoFlex\teste2.mxml
FlashDevelop
Tools > Flash Tools > Build Current File

Após permitir:


Incorporação do arquivo teste2.swf nesta página:

Video Display
Exemplo:
) Abra o FlashDevelop
2) Crie o arquivo MXML
Nenu Fle > New > MXML Document > webcam2009
3) Recorte e cole o código fonte baixo:

Arquivo: webcam3.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                          xmlns:s="library://ns.adobe.com/flex/spark"
                          xmlns:mx="library://ns.adobe.com/flex/mx"
                          minWidth="955" minHeight="600"
creationComplete="application1_creationCompleteHandler(event)">
       <fx:Script>
               <![CDATA[
                       import mx.events.FlexEvent;
                       import mx.utils.ObjectUtil;
                       protected function application1_creationCompleteHandler(event:FlexEvent):void{
                               // TODO Auto-generated method stub
                               var video:Video = new Video();
                               var camera:Camera = Camera.getCamera();
                               camera.setQuality(0,85);  // qualidade 85% JPEG não importa banda máxima
                               camera.setQuality(60000, 0);  // banda máxima 60kb/s com qualidade automática
                               video.attachCamera(camera);
                               TADados.text = ObjectUtil.toString(camera);
                               VD.addChild(video);
                       }
               ]]>
       </fx:Script>
       <fx:Declarations>
          
       </fx:Declarations>
       <s:VideoDisplay id="VD" >
       </s:VideoDisplay>
       <s:TextArea id="TADados" x="350" y="10">
       </s:TextArea>
</s:Application>

4) Compilação e execução:
Menu Tools > Flash Tools > Build Current File

A figura acima é a filmagem da própria tela do meu computador.

5) Incorporação do arquivo webcam3.swf nesta página:
Adicione o código abaixo no corpo da página para o teste em tempo real. Observe que o arquivo webcam2009.swf foi criado com a compilação do arquivo webcam2009.mxml.
...
<body>
<object data="swf\webcam3.swf" type="application/x-shockwave-flash" height="350" width="600">
  <param value="swf\webcam3.swf" name="movie">
  <param value="transparent" name="wmode">
</object>
</body>
...
 
Webcams instaladas
Arquivo: camera1.mxml
<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2008/01/25/getting-specific-camera-instances-using-the-static-cameragetcamera-method/ -->
<mx:Application name="Camera_getCamera_test"
        xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="horizontal"
        verticalAlign="top"
        backgroundColor="white"
        creationComplete="init();">
 
    <mx:Script>
        <![CDATA[
            import flash.media.Camera;
            import mx.controls.Alert;
            import mx.events.ListEvent;
            import mx.utils.ObjectUtil;
 
            private var camera:Camera;
 
            private function init():void {
                if (Camera.names.length == 0) {
                    Alert.show("You do not have any cameras attached.");
                    list.enabled = false;
                    textArea.enabled = false;
                }
            }
 
            private function list_change(evt:ListEvent):void {
                var tList:List = evt.currentTarget as List;
                var cameraName:String = tList.selectedIndex.toString();
                camera = Camera.getCamera(cameraName);
                textArea.text = ObjectUtil.toString(camera);
            }
        ]]>
    </mx:Script>
 
    <mx:Panel id="panel"
            title="Installed cameras:"
            status="{list.dataProvider.length} camera(s)">
        <mx:List id="list"
                dataProvider="{Camera.names}"
                width="200"
                change="list_change(event);" />
    </mx:Panel>
 
    <mx:TextArea id="textArea"
            editable="false"
            width="100%"
            height="100%" />
 
</mx:Application>

Resultado:
 

Buffers de quadros


Tamanho do buffer de quadros é a quantidade total de memória de sistema bloqueado pelo BIOS para vídeo. A tamanho do buffer de quadro maior deve resultar em desempenho de vídeo superior.

Para ajustar o tamanho do buffer de quadros no BIOS:

1. Pressione F2 durante a inicialização para entrar na configuração do BIOS. 
2. Vá para o menu Avançado> Configuração de vídeo. 
3. Defina o tamanho do buffer de quadros (as opções podem variar de acordo com modelo da placa). 
4. Pressione F10 para salvar e sair da configuração do BIOS.

Setup > Advance Chipset Features > Frame Buffer Size: Disabled, 128M ou 256 M.

Assim, os sons de que, se você tiver uma placa de vídeo onboard, ou cartão de intergrated, este é o lugar onde você deve definir-se a quantidade de memória seria alocada a partir de sua memória RAM total do sistema. Se você tiver uma placa de vídeo real instalada em seu computador, então eu não acho que isso realmente se aplica. Vou ler um pouco mais para ver se eu posso encontrar todos os benefícios de ajustes que com cartão e slot de expansão instalada. Nesse meio tempo, se alguém tem algo a acrescentar, por favor, faça e me corrija se minha suposição está errada.