Ecriture de méthodes de rappel pour les métadonnées et les points de repère

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

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