Vous pouvez déclencher des actions au sein de votre application lorsque le lecteur reçoit des métadonnées spécifiques ou lorsque des points de repère particuliers sont atteints. Lorsque ces événements se produisent, vous devez utiliser des méthodes de rappel spécifiques en tant que gestionnaires d’événements. La classe NetStream spécifie les événements de métadonnées suivants qui se produisent lors de la lecture :
onCuePoint
(fichiers FLV uniquement),
onImageData
,
onMetaData
,
onPlayStatus
,
onTextData
et
onXMPData
.
Si vous ne créez pas de méthodes de rappel pour ces gestionnaires, le moteur d’exécution Flash risque de générer des erreurs. Par exemple, le code ci-dessous lit le fichier FLV video.flv situé dans le même dossier que le fichier 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);
Le code ci-dessus charge un fichier vidéo local nommé video.flv et attend la distribution de l’événement
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
). Cet événement est distribué lorsqu’une exception est renvoyée par du code asynchrone natif. Dans notre cas, il est distribué lorsque le fichier vidéo contient des métadonnées ou des informations de point de repère et que les écouteurs appropriés n’ont pas été définis. Le code ci-dessus gère l’événement
asyncError
et ignore l’erreur si vous n’êtes pas intéressé par les métadonnées ou les informations de point de repère. Si vous disposiez d’un fichier FLV avec des métadonnées et plusieurs points de repère, la fonction
trace()
afficherait les messages d’erreur suivants :
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.
L’erreur est renvoyée parce que l’objet NetStream n’a pas trouvé de méthode de rappel pour
onMetaData
ou
onCuePoint
. Il existe plusieurs façons de définir ces méthodes de rappel dans une application.
Définir la propriété « client » de l’objet NetStream comme Object
En définissant la propriété
client
comme étant soit un object, soit une sous-classe de NetStream, vous pouvez re-router les méthodes de rappel de
onMetaData
et
onCuePoint
ou les ignorer totalement. L’exemple suivant montre comment utiliser un objet vide pour ignorer les méthodes de rappel sans écouter l’événement
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);
Pour écouter les méthodes de rappel de
onMetaData
ou
onCuePoint
, il est nécessaire de définir des méthodes pour les gérer, comme dans le fragment de code suivant :
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
function metaDataHandler(infoObject:Object):void
{
trace("metadata");
}
Le code ci-dessus écoute la méthode de rappel de
onMetaData
et appelle la méthode
metaDataHandler()
, qui renvoie une chaîne. Si le moteur d’exécution Flash trouve un point de repère, aucune erreur n’est renvoyée, bien qu’aucune méthode de rappel de
onCuePoint
ne soit définie.
Créer une classe et définir des méthodes pour gérer les méthodes de rappel
Le code suivant définit la propriété
client
de l’objet NetStream comme étant une classe personnalisée, CustomClient, qui définit des gestionnaires pour les méthodes de rappel :
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 contient le code suivant :
package
{
public class CustomClient
{
public function onMetaData(infoObject:Object):void
{
trace("metadata");
}
}
}
La classe CustomClient définit un gestionnaire pour le rappel de
onMetaData
. Si un point de repère est détecté et que le gestionnaire de rappel de
onCuePoint
est appelé, un événement
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
) est distribué pour informer que flash.net.NetStream n’a pas pu appeler de rappel pour onCuePoint. Pour éviter l’apparition de cette erreur, il est nécessaire de définir soit une méthode de rappel de
onCuePoint
dans la classe CustomClient, soit un gestionnaire d’événement pour l’événement
asyncError
.
Etendre la classe NetStream et lui ajouter des méthodes pour gérer les méthodes de rappel
Le code suivant crée une occurrence de la classe CustomNetStream, qui sera définie ultérieurement :
var ns:CustomNetStream = new CustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
L’exemple de code suivant définit la classe CustomNetStream qui étend la classe NetStream, prend en charge la création de l’objet NetConnection nécessaire, et gère les méthodes de rappel de
onMetaData
et
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 vous souhaitez renommer les méthodes
onMetaData()
et
onCuePoint()
de la classe CustomNetStream, utilisez le code suivant :
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");
}
}
}
Etendre la classe NetStream et la rendre dynamique
Vous pouvez étendre la classe NetStream en créant une sous-classe dynamique afin de pouvoir ajouter dynamiquement les gestionnaires de rappel de
onCuePoint
et
onMetaData
. Le code suivant en fait la démonstration :
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
La classe DynamicCustomNetStream contient le code suivant :
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);
}
}
}
Même sans gestionnaire pour le rappel de
onMetaData
et
onCuePoint
, aucune erreur n’est renvoyée puisque la classe DynamicCustomNetStream est dynamique. Si vous souhaitez définir des méthodes pour les gestionnaires de rappel de
onMetaData()
et
onCuePoint()
, utilisez le code suivant :
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");
}
Définir la propriété « client » de l’objet NetStream comme this
En donnant à la propriété
client
la valeur
this
, l’application recherche dans la portée des méthodes
onMetaData()
et
onCuePoint()
. Le code suivant en est un exemple :
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 les gestionnaires de rappel de
onMetaData
ou
onCuePoint
sont appelés et qu’il n’existe pas de méthode pour gérer le rappel, aucune erreur n’est générée. Pour gérer ces gestionnaires de rappel, créez des méthodes
onMetaData()
et
onCuePoint()
dans votre code, comme dans le fragment de code suivant :
function onMetaData(infoObject:Object):void
{
trace("metadata");
}
function onCuePoint(infoObject:Object):void
{
trace("cue point");
}