Scrittura di metodi di callback per metadati e cue point

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Potete attivare azioni nell'applicazione quando il lettore riceve metadati specifici o quando si raggiungono cue point specifici. Quando si verificano questi eventi, occorre utilizzare metodi di callback specifici come gestori di eventi. La classe NetStream specifica gli eventi di metadati seguenti che si possono verificare durante la riproduzione: onCuePoint (solo file FLV), onImageData, onMetaData, onPlayStatus, onTextData e onXMPData.

Per evitare che il runtime Flash generi degli errori, per questi gestori è necessario scrivere dei metodi di callback. Ad esempio, il codice seguente riproduce un file FLV di nome video.flv nella stessa cartella in cui si trovano i file 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);

Il codice precedente carica un file video locale di nome video.flv e intercetta l'evento asyncError (AsyncErrorEvent.ASYNC_ERROR) da inviare. L'evento viene inviato quando viene generata un'eccezione da un codice asincrono nativo. In questo caso, viene inviato quando il file video contiene dei metadati o delle informazioni relative ai cue point e non sono stati definiti i listener appropriati. Il codice precedente gestisce l'evento asyncError e ignora l'errore se non siete interessati ai metadati o alle informazioni sui cue point presenti nel file video. Se era disponibile un FLV con metadati e diversi cue point, la funzione trace() visualizza i messaggi di errore seguenti:

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.

Gli errori si verificano perché l'oggetto NetStream non è stato in grado di trovare un metodo di callback onMetaData o onCuePoint. Esistono vari modi per definire questi metodi di callback all'interno delle applicazioni.

Impostare la proprietà client dell'oggetto su un oggetto

Impostando la proprietà client su un oggetto o su una sottoclasse di NetStream, è possibile reindirizzare i metodi di callback onMetaData e onCuePoint oppure ignorarli completamente. L'esempio seguente dimostra come utilizzare un oggetto vuoto per ignorare i metodi di callback senza intercettare l'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);

Se desiderate intercettare uno solo tra i metodi di callback onMetaData o onCuePoint, è necessario definire i metodi per gestire tali metodi di callback, come mostrato nello snippet di codice seguente:

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

Il codice precedente intercetta il metodo di callback onMetaData e chiama il metodo metaDataHandler(), che traccia una stringa. Se il runtime Flash ha incontrato un cue point, non viene generato nessun errore anche se non è definito nessun metodo di callback onCuePoint.

Creare una classe personalizzata e definire i metodi per gestire i metodi di callback

Il codice seguente imposta la proprietà client dell'oggetto NetStream sulla classe personalizzata CustomClient, che definisce i gestori dei metodi di callback:

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

La classe CustomClient ha l'aspetto seguente:

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

La classe CustomClient definisce un gestore per il gestore di callback onMetaData. Se si incontra un cue point e viene chiamato il metodo di callback onCuePoint, viene inviato un evento asyncError (AsyncErrorEvent.ASYNC_ERROR) che visualizza il messaggio “flash.net.NetStream non è riuscito a chiamare il callback onCuePoint”. Per impedire questo errore, è necessario definire un metodo di callback onCuePoint nella classe CustomClient oppure definire un gestore di eventi per l'evento asyncError.

Estendere la classe NetStream e aggiungere i metodi per gestire i metodi di callback

Il codice seguente crea un'istanza della classe CustomNetStream, che viene definita in un esempio di codice successivo:

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

L'esempio di codice seguente definisce la classe CustomNetStream che estende la classe NetStream, gestisce la creazione dell'oggetto NetConnection necessario e gestisce i metodi del gestore di callback 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"); 
        } 
    } 
}

Se desiderate rinominare i metodi onMetaData() e onCuePoint() nella classe CustomNetStream, potete utilizzare il codice seguente:

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

Estendere la classe NetStream e renderla dinamica

Potete estendere la classe NetStream e rendere la sottoclasse dinamica così da poter aggiungere dinamicamente i gestori di callback onCuePoint e onMetaData. Questo comportamento viene illustrato nell'esempio seguente:

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

La classe DynamicCustomNetStream ha l'aspetto seguente:

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

Anche in assenza di gestori per i gestori di callback onMetaData e onCuePoint non vengono generati errori, poiché la classe DynamicCustomNetStream è dinamica. Se desiderate definire i metodi per i gestori di callback onMetaData e onCuePoint, potete utilizzare il codice seguente:

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

Impostare la proprietà client dell'oggetto NetStream su questo valore

Impostando la proprietà client su this, l'applicazione cerca nell'area di validità corrente i metodi onMetaData() e onCuePoint(). Il codice seguente contiene un esempio in tal senso:

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 viene chiamato il gestore di callback onMetaData o onCuePoint e non esiste alcun metodo per gestire il callback, non viene generato alcun errore. Per gestire questi gestori di callback, create un metodo onMetaData() e un metodo onCuePoint() nel codice, come mostrato nello snippet seguente:

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