U kunt handelingen in uw toepassing activeren wanneer bepaalde metagegevens zijn ontvangen of bepaalde actiepunten zijn bereikt door de speler. Wanneer deze gebeurtenissen optreden, moet u bepaalde callbackmethoden gebruiken als gebeurtenishandlers. De klasse NetStream geeft de volgende metagegevensgebeurtenissen op die kunnen optreden tijdens het afspelen:
onCuePoint
(alleen FLV-bestanden),
onImageData
,
onMetaData
,
onPlayStatus
,
onTextData
en
onXMPData
.
U moet callbackmethoden voor deze handlers maken. Anders kunnen er fouten optreden in Flash-runtime. De volgende code speelt bijvoorbeeld het FLV-bestand video.flv in dezelfde map als het SWF-bestand af:
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);
De vorige code laadt het lokale videobestand video.flv en luistert of
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
) wordt verzonden. Deze gebeurtenis wordt verzonden wanneer een uitzonderingsfout wordt gegenereerd vanuit native asynchrone code. In dit geval wordt de gebeurtenis verzonden wanneer het videobestand metagegevens of informatie over actiepunten bevat, en de juiste listeners niet zijn gedefinieerd. De vorige code handelt de gebeurtenis
asyncError
af en negeert de fout wanneer u niet bent geïnteresseerd in de metagegevens of de informatie over actiepunten van het videobestand. Wanneer u een FLV-bestand met metagegevens en verschillende actiepunten had, zou de functie
trace()
de volgende foutberichten weergeven:
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.
De fouten treden op omdat het NetStream-object de callbackmethode
onMetaData
of
onCuePoint
niet kon vinden. U kunt deze callbackmethoden op verschillende manieren in uw toepassingen definiëren.
De eigenschap client van het NetStream-object op een object instellen
Wanneer u de eigenschap
client
op een object of een subklasse van NetStream instelt, kunt u de callbackmethoden
onMetaData
en
onCuePoint
doorsturen of volledig negeren. In het volgende voorbeeld ziet u hoe u een leeg object kunt gebruiken om de callbackmethoden te negeren, zonder naar de gebeurtenis
asyncError
te luisteren:
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);
Wanneer u naar de callbackmethode
onMetaData
of
onCuePoint
wilt luisteren, moet u methoden definiëren om die callbackmethoden af te handelen. Dit wordt in het volgende fragment getoond:
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
function metaDataHandler(infoObject:Object):void
{
trace("metadata");
}
De vorige code luistert naar de callbackmethode
onMetaData
en roept de methode
metaDataHandler()
op, die een tekenreeks traceert. Als de Flash-runtime een actiepunt tegenkomt, treden er geen fouten op, zelfs als geen callbackmethode
onCuePoint
is gedefinieerd.
Aangepaste klassen maken en methoden definiëren voor het afhandelen van callbackmethoden
De volgende code stelt de eigenschap
client
van het NetStream-object in op de aangepaste klasse CustomClient, die handlers voor de callbackmethoden definieert:
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);
De klasse CustomClient ziet er als volgt uit:
package
{
public class CustomClient
{
public function onMetaData(infoObject:Object):void
{
trace("metadata");
}
}
}
De klasse CustomClient definieert een handler voor de callbackhandler
onMetaData
. Wanneer Flash Player een actiepunt tegenkomt en de callbackhandler
onCuePoint
is aangeroepen, wordt de gebeurtenis
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
) verzonden om aan te geven dat flash.net.NetStream de callback onCuePoint niet kon aanroepen. U kunt deze fout voorkomen door de callbackmethode
onCuePoint
in de klasse CustomClient te definiëren of door een gebeurtenishandler voor de gebeurtenis
asyncError
te definiëren.
De klasse NetStream uitbreiden en methoden toevoegen voor het afhandelen van callbackmethoden
In de volgende code wordt een instantie van de klasse CustomNetStream gemaakt die in een later codevoorbeeld wordt gedefinieerd:
var ns:CustomNetStream = new CustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
Het volgende codevoorbeeld definieert de klasse CustomNetStream die de klasse NetStream uitbreidt, het maken van het benodigde NetConnection-object afhandelt en de methoden
onMetaData
en
onCuePoint
voor de callbackhandler afhandelt:
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");
}
}
}
Wanneer u de methoden
onMetaData()
en
onCuePoint()
in de klasse CustomNetStream wilt hernoemen, kunt u de volgende code gebruiken:
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");
}
}
}
De klasse NetStream uitbreiden en dynamisch maken
U kunt de klasse NetStream uitbreiden en de subklasse dynamisch maken, zodat de callbackhandlers
onCuePoint
en
onMetaData
dynamisch kunnen worden toegevoegd. Dit wordt geïllustreerd in het volgende codevoorbeeld:
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
De klasse DynamicCustomNetStream ziet er als volgt uit:
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);
}
}
}
Er worden zelfs geen fouten gegenereerd wanneer de callbackhandlers
onMetaData
en
onCuePoint
geen handlers bevatten, omdat de klasse DynamicCustomNetStream dynamisch is. Wanneer u de methoden
onMetaData()
en
onCuePoint()
voor de callbackhandlers wilt hernoemen, kunt u de volgende code gebruiken:
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");
}
De eigenschap client van het NetStream-object op this instellen
Wanneer u de eigenschap
client
op
this
instelt, zoekt de toepassing in het huidige bereik naar de methoden
onMetaData()
en
onCuePoint()
. Dit wordt in het volgende voorbeeld geïllustreerd:
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);
Wanneer de callbackhandler
onMetaData
of
onCuePoint
wordt aangeroepen en er geen methoden voor het afhandelen van de callback bestaan, worden er door Flash Player geen fouten gegenereerd. Wanneer u deze callbackhandlers wilt afhandelen, kunt u de methoden
onMetaData()
en
onCuePoint()
in uw code maken. Dit wordt in het volgende codevoorbeeld geïllustreerd:
function onMetaData(infoObject:Object):void
{
trace("metadata");
}
function onCuePoint(infoObject:Object):void
{
trace("cue point");
}