Callbackmethoden schrijven voor metagegevens en actiepunten

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

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