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