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:
-
Escute o evento StageVideoAvailabilityEvent. STAGE_VIDEO_AVAILABILITY para descobrir quando o vetor Stage.stageVideos foi alterado.
Consulte
Utilizando o evento StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY
.
-
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.
-
Anexe um objeto NetStream utilizando
StageVideo.attachNetStream()
ou anexe um objeto Camera utilizando
StageVideo.attachCamera()
.
-
Reproduza o vídeo usando
NetStream.play()
.
-
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
.
-
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:
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.
|
|
|