Escritura de métodos callback para metadatos y puntos de referencia

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Puede activar acciones en su aplicación cuando el reproductor reciba metadatos específicos o cuando se alcancen puntos de referencia concretos. Cuando se produzcan estos eventos, debe utilizar métodos callback específicos como controladores de eventos. La clase NetStream especifica los siguientes eventos de metadatos que pueden suceder durante la reproducción: onCuePoint (solo archivos FLV), onImageData , onMetaData , onPlayStatus , onTextData y onXMPData .

Se deben escribir métodos callback para estos controladores; de lo contrario, el motor de ejecución de Flash podría generar errores. Por ejemplo, en el código siguiente se reproduce un archivo FLV denominado video.flv en la misma carpeta donde se encuentra el archivo 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);

El código anterior carga un archivo de vídeo local llamado video.flv y detecta la distribución de asyncError ( AsyncErrorEvent.ASYNC_ERROR ). Este evento se distribuye cuando se genera una excepción desde el código asincrónico nativo. En este caso, se distribuye cuando un el archivo de vídeo contiene metadatos o información de punto de referencia y no se han definido los detectores apropiados. El código anterior controla el evento asyncError y omite el error si no interesan los metadatos o la información de punto de referencia del archivo de vídeo. Si tuviera un archivo FLV con metadatos y varios puntos de referencia, la función trace() mostraría los siguientes mensajes de error:

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.

Los errores se producen porque el objeto NetStream no ha podido encontrar un método callback onMetaData o onCuePoint . Hay varias maneras de definir estos métodos callback en las aplicaciones.

Definición de la propiedad client del objeto NetStream en Object

Al establecer la propiedad client en Object o una subclase de NetStream, se pueden redirigir los métodos callback onMetaData y onCuePoint , o bien, omitirlos completamente. En el ejemplo siguiente se demuestra cómo se puede utilizar una clase Object vacía para omitir los métodos callback sin detectar el 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);

Si se desea detectar los métodos callback onMetaData o onCuePoint , es necesario definir métodos para controlarlos, tal y como se muestra en el siguiente fragmento de código:

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

El código anterior detecta el método callback onMetaData y llama al método metaDataHandler() , que rastrea una cadena. Si el motor de ejecución de Flash ha detectado un punto de referencia, no se generarán errores aunque se defina el método callback onCuePoint .

Creación de una clase personalizada y definición de métodos para controlar los métodos callback

En el código siguiente se establece la propiedad client del objeto NetStream en una clase personalizada, CustomClient, que define controladores para los métodos 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 clase CustomClient se presenta del siguiente modo:

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

La clase CustomClient define un controlador para el controlador callback onMetaData . Si se ha detectado un punto de referencia y se ha llamado al controlador callback onCuePoint , se distribuirá un evento asyncError ( AsyncErrorEvent.ASYNC_ERROR ) indicando que flash.net.NetStream no ha podido invocar la función callback onCuePoint. Para evitar este error, se debe definir un método callback onCuePoint en la clase CustomClient, o bien definir un controlador de eventos para el evento asyncError .

Ampliación de la clase NetStream y adición de métodos para controlar los métodos callback

El código siguiente crea una instancia de la clase CustomNetStream, que se define en un listado de código posterior:

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

En la lista de códigos siguiente se define la clase CustomNetStream que amplía la clase NetStream y controla la creación del objeto NetConnection necesario y los métodos de controlador callback onMetaData y 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"); 
        } 
    } 
}

Si se desea cambiar el nombre de los métodos onMetaData() y onCuePoint() en la clase CustomNetStream, se podría utilizar el código siguiente:

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

Ampliación y dinamización de la clase NetStream

Se puede ampliar la clase NetStream y hacer que la subclase sea dinámica, de manera que los controladores callback onCuePoint y onMetaData puedan añadirse dinámicamente. Esto se ilustra en la lista siguiente:

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

La clase DynamicCustomNetStream es de esta forma:

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

Incluso sin controladores para los controladores callback onMetaData y onCuePoint , no se generan errores, ya que la clase DynamicCustomNetStream es dinámica. Si se desea definir métodos para los controladores callback onMetaData y onCuePoint , se puede utilizar el código siguiente:

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

Establecimiento de la propiedad client del objeto NetStream en this

Si la propiedad client se establece en this , la aplicación busca en el ámbito actual los métodos onMetaData() y onCuePoint() . Esto se puede observar en el ejemplo siguiente:

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

Si se llama a los controladores callback onMetaData o onCuePoint y no hay métodos para controlar la función callback, no se generan errores. Para controlar estos controladores callback, hay que crear métodos onMetaData() y onCuePoint() en el código, tal como se muestra en el siguiente fragmento de código:

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