Criação de métodos de retorno de chamada para metadados e pontos de sinalização

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

É possível iniciar ações no seu aplicativo quando metadados específicos são recebidos pelo player ou quando se atingem determinados pontos de sinalização. Quando esses eventos ocorrem, você deve usar métodos de retorno de chamada específicos como manipuladores de eventos. A classe NetStream especifica os seguintes eventos de metadados, que podem ocorrer durante a reprodução: onCuePoint (somente em arquivos FLV), onImageData , onMetaData , onPlayStatus , onTextData e onXMPData .

Você deve criar métodos de retorno de chamada para esses manipuladores, ou o tempo de execução do Flash poderá gerar erros. Por exemplo, o código a seguir reproduz um arquivo FLV chamado video.flv na mesma pasta em que reside o arquivo SWF:

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var ns:NetStream = new NetStream(nc); 
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
ns.play("video.flv"); 
function asyncErrorHandler(event:AsyncErrorEvent):void 
{ 
    trace(event.text); 
} 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

O código anterior carrega um arquivo de vídeo local chamado video.flv e monitora o evento asyncError ( AsyncErrorEvent.ASYNC_ERROR ) a ser despachado. Esse evento é despachado quando o código assíncrono nativo gera uma exceção. Nesse caso, ele é despachado quando o arquivo de vídeo contém informações de metadados ou de ponto de sinalização e os ouvintes apropriados não foram definidos. O código anterior manipula o evento asyncError e ignora o erro se você não está interessado nas informações de metadados ou de ponto de sinalização do arquivo de vídeo. Se você tivesse um arquivo FLV com metadados e vários pontos de sinalização, a função trace() exibiria as seguintes mensagens de erro:

Error #2095: flash.net.NetStream was unable to invoke callback onMetaData. 
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint. 
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint. 
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint.

Os erros ocorrem porque o objeto NetStream não conseguiu encontrar um método de retorno de chamada onMetaData ou onCuePoint . Existem diversas maneiras de definir esses métodos de retorno de chamada nos seus aplicativos.

Definir a propriedade client do objeto NetStream como Object

Ao definir a propriedade client como Object ou uma subclasse de NetStream, você pode redirecionar os métodos de retorno de chamada onMetaData e onCuePoint ou ignorá-los completamente. O exemplo a seguir demonstra como usar um Object vazio para ignorar os métodos de retorno de chamada sem monitorar o evento asyncError :

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var customClient:Object = new Object(); 
 
var ns:NetStream = new NetStream(nc); 
ns.client = customClient; 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

Para monitorar os métodos de retorno de chamada onMetaData ou onCuePoint , seria preciso definir métodos para manipular esses métodos de retorno de chamada, conforme mostrado no seguinte snippet:

var customClient:Object = new Object(); 
customClient.onMetaData = metaDataHandler; 
function metaDataHandler(infoObject:Object):void 
{ 
    trace("metadata"); 
}

O código anterior monitora o método de retorno de chamada onMetaData e chama o método metaDataHandler() , que rastreia uma string. Se o tempo de execução do Flash encontrasse um ponto de sinalização, nenhum erro seria gerado, mesmo que não tenha sido definido um método de retorno de chamada onCuePoint .

Criar uma classe personalizada e definir métodos para manipular os métodos de retorno de chamada

O seguinte código define a propriedade client do objeto NetStream como uma classe personalizada, CustomClient, que define manipuladores para os métodos de retorno de chamada:

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var ns:NetStream = new NetStream(nc); 
ns.client = new CustomClient(); 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

Esta é a classe CustomClient:

package 
{ 
    public class CustomClient 
    { 
        public function onMetaData(infoObject:Object):void 
        { 
            trace("metadata"); 
        } 
    } 
}

A classe CustomClient define um manipulador para o manipulador de retorno de chamada onMetaData . Se fosse encontrado um ponto de sinalização e o manipulador de retorno de chamada onCuePoint fosse chamado, seria despachado um evento asyncError ( AsyncErrorEvent.ASYNC_ERROR ) informando que flash.net.NetStream não pôde chamar o manipulador de retorno de chamada onCuePoint. Para evitar esse erro, seria necessário definir um método de retorno de chamada onCuePoint na classe CustomClient ou definir um manipulador de eventos para o evento asyncError .

Estender a classe NetStream e adicionar métodos para manipular os métodos de retorno de chamada

O código abaixo cria uma ocorrência da classe CustomNetStream, que é definida em uma listagem de código mais adiante:

var ns:CustomNetStream = new CustomNetStream(); 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

A seguinte listagem de código define a classe CustomNetStream que estende a classe NetStream, manipula a criação do objeto NetConnection necessário e manipula os métodos de manipulador de retorno de chamada onMetaData e onCuePoint :

package 
{ 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    public class CustomNetStream extends NetStream 
    { 
        private var nc:NetConnection; 
        public function CustomNetStream() 
        { 
            nc = new NetConnection(); 
            nc.connect(null); 
            super(nc); 
        } 
        public function onMetaData(infoObject:Object):void 
        { 
            trace("metadata"); 
        } 
        public function onCuePoint(infoObject:Object):void 
        { 
            trace("cue point"); 
        } 
    } 
}

Para renomear os métodos onMetaData() e onCuePoint() na classe CustomNetStream, use o seguinte código:

package 
{ 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    public class CustomNetStream extends NetStream 
    { 
        private var nc:NetConnection; 
        public var onMetaData:Function; 
        public var onCuePoint:Function; 
        public function CustomNetStream() 
        { 
            onMetaData = metaDataHandler; 
            onCuePoint = cuePointHandler; 
            nc = new NetConnection(); 
            nc.connect(null); 
            super(nc); 
        } 
        private function metaDataHandler(infoObject:Object):void 
        { 
            trace("metadata"); 
        } 
        private function cuePointHandler(infoObject:Object):void 
        { 
            trace("cue point"); 
        } 
    } 
}

Estender a classe NetStream e torná-la dinâmica

É possível estender a classe NetStream e tornar a subclasse dinâmica para que os manipuladores de retorno de chamada onCuePoint e onMetaData possam ser adicionados dinamicamente. Isso é demonstrado na listagem a seguir:

var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

Esta é a classe DynamicCustomNetStream:

package 
{ 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    public dynamic class DynamicCustomNetStream extends NetStream 
    { 
        private var nc:NetConnection; 
        public function DynamicCustomNetStream() 
        { 
            nc = new NetConnection(); 
            nc.connect(null); 
            super(nc); 
        } 
    } 
}

Mesmo sem manipuladores para os manipuladores de retorno de chamada onMetaData e onCuePoint , não são gerados erros porque a classe DynamicCustomNetStream é dinâmica. Para definir métodos para os manipuladores de retorno de chamada onMetaData e onCuePoint , use o seguinte código:

var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); 
ns.onMetaData = metaDataHandler; 
ns.onCuePoint = cuePointHandler; 
ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid); 
 
function metaDataHandler(infoObject:Object):void 
{ 
    trace("metadata"); 
} 
function cuePointHandler(infoObject:Object):void 
{ 
    trace("cue point"); 
}

Definir a propriedade client do objeto NetStream como this

Quando se define a propriedade client como this , o aplicativo procura os métodos onMetaData() e onCuePoint() no escopo atual. Este exemplo demonstra isso:

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var ns:NetStream = new NetStream(nc); 
ns.client = this; 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid);

Se os manipuladores de retorno de chamada onMetaData ou onCuePoint são chamados e não existem métodos para manipular o retorno de chamada, nenhum erro é gerado. Para manipular esses manipuladores de retorno de chamada, crie um método onMetaData() e onCuePoint() no seu código, como visto no snippet abaixo:

function onMetaData(infoObject:Object):void 
{ 
    trace("metadata"); 
} 
function onCuePoint(infoObject:Object):void 
{ 
    trace("cue point"); 
}