Schreiben von Rückrufmethoden für Metadaten und Cue-Points

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Wenn bestimmte Cue-Points erreicht oder bestimmte Metadaten vom Player empfangen werden, können Sie Aktionen in Ihrer Anwendung auslösen. Wenn diese Ereignisse eintreten, müssen Sie bestimmte Rückrufmethoden als Ereignisprozeduren verwenden. Die NetStream-Klasse gibt die folgenden Metadatenereignisse an, die während der Wiedergabe eintreten können: onCuePoint (nur FLV-Dateien), onImageData , onMetaData , onPlayStatus , onTextData und onXMPData .

Sie müssen jedoch Rückrufmethoden für diese Prozeduren schreiben, da die Flash-Laufzeitumgebung andernfalls Fehler auslösen könnte. Beispielsweise wird mit dem folgenden Code eine FLV-Datei namens „video.flv“ aus dem gleichen Ordner wie Ihre SWF-Datei wiedergegeben:

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

Mit dem oben stehenden Code wird eine lokale Videodatei mit dem Namen „video.flv“ geladen und überwacht, ob das asyncError -Ereignis ( AsyncErrorEvent.ASYNC_ERROR ) ausgelöst wird. Dieses Ereignis wird ausgelöst, wenn eine Ausnahme vom nativen asynchronen Code ausgelöst wird. In diesem Fall wird es ausgelöst, wenn die Videodatei Metadaten oder Cue-Point-Informationen enthält und die entsprechenden Listener nicht definiert wurden. Mit dem vorangegangenen Code wird das asyncError -Ereignis verarbeitet und der Fehler ignoriert, wenn Sie nicht an den Metadaten oder Cue-Point-Informationen in der Videodatei interessiert sind. Wenn Sie eine FLV-Datei mit Metadaten und verschiedenen Cue-Points haben, gibt die trace() -Funktion die folgenden Fehlermeldungen zurück:

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.

Die Fehler treten auf, da das NetStream-Objekt keine onMetaData - oder onCuePoint -Rückrufmethode finden konnte. Diese Rückrufmethoden können in Ihrer Anwendung auf verschiedene Arten definiert werden.

Festlegen eines Objekts für die client-Eigenschaft des NetStream-Objekts

Durch Festlegen der client -Eigenschaft auf ein Objekt oder eine Unterklasse von NetStream können Sie die Rückrufmethoden onMetaData und onCuePoint entweder umleiten oder vollständig ignorieren. Im folgenden Code wird veranschaulicht, wie Sie ein leeres Objekt verwenden, um die Rückrufmethoden zu ignorieren, ohne das asyncError -Ereignis zu überwachen:

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

Wenn Sie die Rückrufmethode onMetaData oder onCuePoint überwachen möchten, müssen Sie Methoden zur Verarbeitung dieser Rückrufmethoden definieren, wie im folgenden Codeausschnitt dargestellt:

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

Mit dem vorangegangenen Code wird die Rückrufmethode onMetaData überwacht und die metaDataHandler() -Methode aufgerufen, die einen String ausgibt. Wenn in der Flash-Laufzeitumgebung ein Cue-Point gefunden wird, werden keine Fehler ausgelöst, auch wenn keine onCuePoint -Rückrufmethode definiert ist.

Erstellen einer benutzerdefinierten Klasse und Definieren von Methoden zur Verarbeitung der Rückrufmethoden

Mit dem folgenden Code wird die client -Eigenschaft des NetStream-Objekts auf eine benutzerdefinierte Klasse eingestellt, die Prozeduren für die Rückrufmethoden definiert:

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

Die CustomClient-Klasse sieht wie folgt aus:

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

Die CustomClient-Klasse definiert eine Prozedur für die onMetaData -Rückrufprozedur. Wenn ein Cue-Point gefunden und die onCuePoint -Rückrufprozedur aufgerufen wurde, wird ein asyncError -Ereignis ( AsyncErrorEvent.ASYNC_ERROR ) mit der Meldung „flash.net.NetStream konnte Rückruf onCuePoint nicht auslösen“ ausgelöst. Um diesen Fehler zu vermeiden, müssen Sie entweder eine onCuePoint -Rückrufmethode in der CustomClient-Klasse oder eine Ereignisprozedur für das asyncError -Ereignis definieren.

Erweitern der NetStream-Klasse und Hinzufügen von Methoden zur Verarbeitung der Rückrufmethoden

Mit dem folgenden Code wird eine Instanz der CustomNetStream-Klasse erstellt, die in einem späteren Codebeispiel definiert wird:

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

Mit dem folgenden Code wird die CustomNetStream-Klasse definiert, die die NetStream-Klasse erweitert, das erforderliche NetConnection-Objekt erstellt und die Methoden der Rückrufprozeduren onMetaData und onCuePoint verarbeitet:

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

Wenn Sie die Methoden onMetaData() und onCuePoint() in der CustomNetStream-Klasse umbenennen möchten, können Sie den folgenden Code verwenden:

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

Erweitern der NetStream-Klasse und Definieren als dynamische Klasse

Sie können die NetStream-Klasse erweitern und diese Unterklasse als dynamische Klasse definieren, sodass die Rückrufmethoden onCuePoint und onMetaData dynamisch hinzugefügt werden können. Dies wird im folgenden Code veranschaulicht:

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

Die DynamicCustomNetStream-Klasse sieht wie folgt aus:

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

Auch wenn keine Prozeduren für die Rückrufprozeduren onMetaData und onCuePoint vorhanden sind, werden keine Fehlermeldungen ausgelöst, da die DynamicCustomNetStream-Klasse dynamisch ist. Wenn Sie Methoden für die Rückrufmethoden onMetaData und onCuePoint definieren möchten, können Sie den folgenden Code verwenden:

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

Setzen der client-Eigenschaft des NetStream-Objekts auf „this“

Durch Setzen der client -Eigenschaft auf this wird in der Anwendung im aktuellen Gültigkeitsbereich nach den Methoden onMetaData() und onCuePoint() gesucht. Dies wird im folgenden Codebeispiel gezeigt:

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

Wenn die Rückrufprozeduren onMetaData oder onCuePoint aufgerufen werden und keine Methoden zur Verarbeitung des Rückrufs vorhanden sind, werden keine Fehlermeldungen erzeugt. Um diese Rückrufprozeduren zu verarbeiten, erstellen Sie eine onMetaData() -Methode und eine onCuePoint() -Methode im Code, wie im folgenden Codeausschnitt dargestellt:

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