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