Uso das APIs StageVideo

O vídeo do palco é um mecanismo no tempo de execução que melhora a reprodução do vídeo e o desempenho do dispositivo. O tempo de execução cria e mantém esse mecanismo. Como desenvolvedor, sua função é configurar seu aplicativo de modo a aproveitá-lo.

Para usar o vídeo do palco, implemente uma estrutura de manipuladores de eventos que detecte quando o vídeo do palco está ou não disponível. Quando você receber uma notificação de que o vídeo do palco está disponível, recupere um objeto StageVideo da propriedade Stage.stageVideos . O tempo de execução preenche esse objeto Vector com um ou mais objetos StageVideo. Em seguida, você pode usar um dos objetos StageVideo fornecidos, em vez de um objeto Video, para exibir o fluxo de vídeo.

No Flash Player, quando receber uma notificação de que o vídeo do palco não está mais disponível, alterne seu fluxo de vídeo de volta para um objeto Video.

Nota: Não é possível criar objetos StageVideo.

Propriedade Stage.stageVideos

A propriedade Stage.stageVideos é um objeto Vector que proporciona acesso a ocorrências de StageVideo. Esse vetor pode conter até quatro objetos StageVideo, dependendo do hardware e dos recursos do sistema. Dispositivos móveis podem estar limitados a um ou nenhum.

Quando o vídeo do palco não está diponível, este vetor não contém nenhum objeto. Para evitar erros no tempo de execução, certifique-se de acessar membros desse vetor somente quando o evento StageVideoAvailability mais recente indicar a disponibilidade do vídeo do palco.

Eventos StageVideo

A estrutura da API StageVideo fornece os seguintes eventos:

StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
Enviado quando a propriedade Stage.stageVideos é alterada. A propriedade StageVideoAvailabilityEvent.availability indica se AVAILABLE (disponível) ou UNAVAILABLE (não disponível). Use este evento para determinar se a propriedade stageVideos contém algum objeto StageVideo, em vez de verificar diretamente o comprimento do vetor Stage.stageVideos .

StageVideoEvent.RENDER_STATE
Enviado quando um objeto NetStream ou Camera tiver sido anexado a um objeto StageVideo e estiver em reprodução. Indica o tipo de decodificação em uso atualmente: hardware, software ou indisponível (nada é exibido). O destino do evento contém as propriedades videoWidth e videoHeight que são seguras para serem usadas para redimensionar a janela de exibição de vídeo.
Importante: As coordenadas obtidas a partir do objeto de destino StageVideo usam as coordenadas Stage visto que não fazem parte da lista de exibição padrão.

VideoEvent.RENDER_STATE
Enviado quando um objeto Video está sendo usado. Indica se a decodificação acelerada por software ou software está em uso. Se este evento indicar a decodificação acelerada por hardware, alterne para um objeto StageVideo, se possível. O destino do evento Video contém as propriedades videoWidth e videoHeight que são seguras para serem usadas para redimensionar a janela de exibição de vídeo.

Fluxo de trabalho para implementar o recurso StageVideo

Siga estas etapas de nível superior para implementar o recurso StageVideo:

  1. Escute o evento StageVideoAvailabilityEvent. STAGE_VIDEO_AVAILABILITY para descobrir quando o vetor Stage.stageVideos foi alterado. Consulte Utilizando o evento StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY .

  2. Se o evento StageVideoAvailabilityEvent. STAGE_VIDEO_AVAILABILITY informar que o vídeo de palco está disponível, use o objeto Vector Stage.stageVideos do manipulador de eventos para acessar um objeto StageVideo.

  3. Anexe um objeto NetStream utilizando StageVideo.attachNetStream() ou anexe um objeto Camera utilizando StageVideo.attachCamera() .

  4. Reproduza o vídeo usando NetStream.play() .

  5. Escute o evento StageVideoEvent.RENDER_STATE no objeto StageVideo para determinar o status da reprodução do vídeo. O recebimento deste evento também indica que as propriedades de largura e de altura do vídeo foram inicializadas ou alteradas. Consulte Utilizando os eventos StageVideoEvent.RENDER_STATE e VideoEvent.RENDER_STATE .

  6. Escute o evento VideoEvent. RENDER_STATE no objeto Video. Este evento fornece os mesmos status que StageVideoEvent. RENDER_STATE; portanto, você também pode usá-lo para determinar se a aceleração de GPU está disponível. O recebimento deste evento também indica que as propriedades de largura e de altura do vídeo foram inicializadas ou alteradas. Consulte Utilizando os eventos StageVideoEvent.RENDER_STATE e VideoEvent.RENDER_STATE .

Inicializando os ouvintes de evento do StageVideo

Configure seus ouvintes StageVideoAvailabilityEvent e VideoEvent durante a inicialização do aplicativo. Por exemplo, você pode inicializar esses ouvintes no manipulador de eventos flash.events.Event.ADDED_TO_STAGE . Este evento garante que seu aplicativo fique visível no palco:

public class SimpleStageVideo extends Sprite 
    private var nc:NetConnection; 
    private var ns:NetStream; 
 
    public function SimpleStageVideo() 
    { 
        // Constructor for SimpleStageVideo class 
        // Make sure the app is visible and stage available 
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 
     
    private function onAddedToStage(event:Event):void 
    { 
        //... 
        // Connections 
        nc = new NetConnection(); 
        nc.connect(null); 
        ns = new NetStream(nc); 
        ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
        ns.client = this; 
 
        // Screen 
        video = new Video(); 
        video.smoothing = true; 
 
        // Video Events 
        // the StageVideoEvent.STAGE_VIDEO_STATE informs you whether 
        // StageVideo is available 
        stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, 
            onStageVideoState); 
        // in case of fallback to Video, listen to the VideoEvent.RENDER_STATE 
        // event to handle resize properly and know about the acceleration mode running 
        video.addEventListener(VideoEvent.RENDER_STATE, videoStateChange); 
        //... 
    }

Utilizando o evento StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY

No manipulador StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY , decida se deve usar um objeto Video ou StageVideo, com base na disponibilidade de StageVideo. Se a propriedade StageVideoAvailabilityEvent.availability estiver definida como StageVideoAvailability.AVAILABLE , use StageVideo. Nesse caso, você pode contar com o vetor Stage.stageVideos para conter um ou mais objetos StageVideo. Obtenha um objeto StageVideo da propriedade Stage.stageVideos e anexe o objeto NetStream para esse. Porque os objetos StageVideo sempre aparecem no fundo, remova o objeto Video existente (sempre em primeiro plano). Aproveite este manipulador do evento para adicionar um ouvinte para o evento StageVideoEvent.RENDER_STATE .

Se a propriedade StageVideoAvailabilityEvent.availability estiver definida como StageVideoAvailability.UNAVAILABLE , não use o StageVideo nem acesse o vetor Stage.stageVideos . Neste caso, anexe o objeto NetStream para um objeto de Video. Finalmente, adicione o objeto StageVideo ou Video ao palco e chame NetStream.play() .

O código a seguir mostra como manipular o evento StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY :

private var sv:StageVideo; 
private var video:Video; 
 
private function onStageVideoState(event:StageVideoAvailabilityEvent):void 
{     
    // Detect if StageVideo is available and decide what to do in toggleStageVideo 
    toggleStageVideo(event.availability == StageVideoAvailability.AVAILABLE); 
} 
 
private function toggleStageVideo(on:Boolean):void 
{     
    // To choose StageVideo attach the NetStream to StageVideo 
    if (on) 
    { 
        stageVideoInUse = true; 
        if ( sv == null ) 
        { 
            sv = stage.stageVideos[0]; 
            sv.addEventListener(StageVideoEvent.RENDER_STATE, stageVideoStateChange); 
                sv.attachNetStream(ns); 
        } 
 
        if (classicVideoInUse) 
        { 
            // If you use StageVideo, remove from the display list the 
            // Video object to avoid covering the StageVideo object 
            // (which is always in the background) 
            stage.removeChild ( video ); 
            classicVideoInUse = false; 
        } 
    } else 
    { 
        // Otherwise attach it to a Video object 
        if (stageVideoInUse) 
            stageVideoInUse = false; 
        classicVideoInUse = true; 
        video.attachNetStream(ns); 
        stage.addChildAt(video, 0); 
    } 
     
    if ( !played ) 
    { 
        played = true; 
        ns.play(FILE_NAME); 
    } 
} 
Importante: A primeira vez que um aplicativo acessa o elemento do vetor em Stage.stageVideos[0], o retângulo padrão é configurado para 0,0,0,0, e as propriedades pan e zoom usam os valores padrão. Sempre definir esses valores para suas configurações de preferência. É possível usar as propriedades videoWidth e videoHeight do destino dos eventos StageVideoEvent.RENDER_STATE ou VideoEvent.RENDER_STATE para calcular as dimensões da janela de exibição de vídeo.

Baixe todo o código-fonte deste exemplo de aplicativo de Introdução ao vídeo do palco .

Utilizando os eventos StageVideoEvent.RENDER_STATE e VideoEvent.RENDER_STATE

Os objetos StageVideo e Video enviam eventos que informam aos aplicativos quando o ambiente de exibição é alterado. Estes eventos são StageVideoEvent.RENDER_STATE e VideoEvent.RENDER_STATE .

Um objeto StageVideo ou Vídeo envia um evento de estado renderizado quando um objeto NetStream é anexado e começa a ser reproduzido. Também envia esse evento quando o ambiente de exibição é alterado; por exemplo, quando a janela de exibição de vídeo é redimensionada. Use essas notificações para redefinir sua janela de exibição para os valores atuais de videoHeight e videoWidth do objeto de destino do evento.

Os estados renderizados informados incluem:

  • RENDER_STATUS_UNAVAILABLE

  • RENDER_STATUS_SOFTWARE

  • RENDER_STATUS_ACCELERATED

Estados renderizados indicam quando a decodificação acelerada por hardware está em uso, independentemente da classe que esteja reproduzindo o vídeo no momento. Marque a propriedade StageVideoEvent.status para saber se a decodificação necessária está disponível. Se essa propriedade estiver definida como "indisponível", o objeto StageVideo não pode reproduzir o vídeo. Este estado exige que você coloque imediatamente de novo o objeto NetStream para um objeto Video. Outros estados informam para seu aplicativo as condições de renderização atuais.

A tabela a seguir descreve as implicações de todos os valores do estado de renderização para objetos StageVideoEvent e VideoEvent em Flash Player:

VideoStatus.ACCELERATED

VideoStatus.SOFTWARE

VideoStatus.UNAVAILABLE

StageVideoEvent

Tanto a decodificação quanto a apresentação acontecem no hardware. (Melhor desempenho.)

Apresentação no hardware, decodificação no software. (Desempenho aceitável.)

Não há recursos da GPU disponíveis para lidar com o vídeo e nada é exibido. Retroceder para um objeto Video.

VideoEvent

Apresentação no software, decodificação no hardware. (Desempenho aceitável apenas em um sistema moderno de desktop. Desempenho degradado em tela cheia.)

Apresentação no software, decodificação no software. (Pior em termos de desempenho de caixa. Desempenho degradado em tela cheia.)

(N/D)

Espaços de cor

O vídeo do palco usa recursos de hardware subjacentes para oferecer suporte a espaços de cor. O conteúdo SWF pode fornecer metadados que indicam seu espaço de cor preferencial. No entanto, o hardware gráfico do dispositivo determina se o espaço de cor pode ser usado. Um dispositivo pode oferecer suporte a vários espaços de cor, enquanto outros não oferecem a nenhum. Se o hardware não oferecer suporte ao espaço de cor necessário, o Flash Player tenta localizar a correspondência mais próxima entre os espaços de cor com suporte.

Para consultar a quais espaços de cor o hardware oferece suporte, use a propriedade StageVideo.colorSpaces . Essa propriedade retorna a lista de espaços de cor com suporte em um vetor String:

var colorSpace:Vector.<String> = stageVideo.colorSpaces();

Para saber qual espaço de cor o vídeo em reprodução no momento está usando, verifique a propriedade StageVideoEvent.colorSpace . Verifique essa propriedade em seu manipulador de eventos quanto ao evento StageVideoEvent.RENDER_STATE :

var currColorSpace:String; 
 
//StageVideoEvent.RENDER_STATE event handler 
private function stageVideoRenderState(event:Object):void 
{ 
    //... 
    currColorSpace = (event as StageVideoEvent).colorSpace; 
    //... 
}

Se o Flash Player não encontrar um substituto para o espaço de cor incompatível, o vídeo do palco usará o espaço de cor padrão BT.601. Por exemplo, fluxos de vídeo com codificação H.264 normalmente usam o espaço de cor BT.709. Se o hardware do dispositivo não oferecer suporte a BT.709, a propriedade colorSpace retornará "BT601" . O valor "unknown" de StageVideoEvent.colorSpace indica que o hardware não oferece nenhum modo de consultar o espaço de cor.

Se seu aplicativo considerar o espaço de cor atual inaceitável, você pode optar por alternar de um objeto StageVideo para um objeto Video. A classe Video oferece suporte a todos os espaços de cor por meio da composição do software.