Skriva callback-metoder för metadata och referenspunkter

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Du kan aktivera åtgärder i programmet när vissa referenspunkter nås eller vissa metadata mottas av spelaren eller när vissa referenspunkter påträffas. När dessa händelser inträffar måste du ange särskilda callback-metoder som händelsehanterare. Klassen NetStream anger följande metadatahändelser som kan inträffa under uppspelning: onCuePoint (enbart FLV-filer), onImageData, onMetaData, onPlayStatus, onTextData och onXMPData.

Du måste skriva callback-metoder för dessa hanterare, annars kan fel uppstå i Flash-körningen. I följande kod spelas en FLV-fil upp med namnet video.flv i samma mapp som SWF-filen finns:

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

Med föregående kod läses en lokal videofil in med namnet video.flv och den lyssnar efter den asyncError (AsyncErrorEvent.ASYNC_ERROR) som ska skickas. Den här händelsen skickas när ett undantag inträffar från den ursprungliga asynkrona koden. I det här fallet skickas den när en videofil innehåller metadata eller referenspunktsinformation och de rätta avlyssnarna inte har definierats. I den föregående koden hanteras asyncError-händelsen och felet ignoreras om du inte är intresserad av videofilens metadata eller referenspunktsinformationen. Om du hade en FLV-fil med metadata och flera referenspunkter visar trace()-funktionen följande felmeddelande:

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.

Felet inträffar för att NetStream-objektet inte kunde hitta någon callback-metod av typen onMetaData eller onCuePoint. Det finns flera sätt att definiera de här återanropsmetoderna i programmet.

Ange NetStream-objektets client-egenskap som ett objekt

Genom att ange client-egenskapen som antingen ett objekt eller en underklass till NetStream, kan du omdirigera callback-metoderna onMetaData och onCuePoint eller helt ignorera dem. I följande exempel visas hur du kan använda ett tomt objekt för att ignorera callback-metoderna utan att avlyssna asyncError-händelsen:

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

Om du vill avlyssna någon av callback-metoderna onMetaData eller onCuePointt, måste du definiera metoder som hanterar dessa callback-metoder enligt exemplet i följande kodutdrag:

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

I föregående kod avlyssnas callback-metoden onMetaData och anropar metaDataHandler()-metoden som spårar en sträng. Om Flash-körningen påträffar en referenspunkt genereras inga fel även om någon callback-metod av typen onCuePoint inte har definierats.

Skapa en anpassad klass och definiera metoder för hantering av återanropsmetoder

I följande kod anges NetStream-objektets client-egenskap som en anpassad klass, CustomClient, som definierar hanterare för callback-metoderna:

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

Klassen CustomClient:

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

I klassen CustomClient definieras en hanterare för callback-hanteraren onMetaData. Om en referenspunkt påträffas och callback-hanteraren onCuePoint anropas, ska en asyncError-händelse (AsyncErrorEvent.ASYNC_ERROR) skickas som anger: ”flash.net.NetStream kunde inte starta callback-funktionen onCuePoint”. För att förhindra det här felet måste du antingen definiera callback-metoden onCuePoint i klassen CustomClient eller definiera en händelsehanterare för asyncError-händelsen.

Utöka klassen NetStream och lägg till metoder för hantering av callback-metoder

I följande kod skapas en instans av klassen CustomNetStream som definieras i en senare kodlista:

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

Följande kod definierar klassen CustomNetStream som utökar klassen NetStream, skapar det nödvändiga NetConnection-objektet och hanterar hanterarmetoderna för onMetaData- och onCuePoint-callback:

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

Om du vill byta namn på onMetaData()- och onCuePoint()-metoderna i klassen CustomNetStream kan du använda följande kod:

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

Utöka klassen NetStream och göra den dynamisk

Du kan utöka klassen NetStream och göra underklassen dynamisk så att callback-hanterarna onCuePoint och onMetaData kan läggas till dynamiskt. Det visas i följande kodexempel:

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

Klassen DynamicCustomNetStream:

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

Även utan hanterare för callback-hanterarna onMetaData och onCuePoint inträffar inga fel eftersom klassen DynamicCustomNetStream är dynamisk. Om du vill definiera metoderna för callback-hanterarna onMetaData och onCuePoint kan du använda följande kod:

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

Ange NetStream-objektets klientegenskap till detta

Om du anger client-egenskapen till this söker programmet i aktuellt omfång efter onMetaData()- och onCuePoint()-metoder. Det visas i följande exempel:

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

Om callback-hanterarna onMetaData- eller onCuePoint anropas och ingen metod finns som hanterar callback-funktionen, genereras inga fel. Om du vill hantera de här callback-hanterarna skapar du en onMetaData()- och onCuePoint()-metod i koden enligt följande kodutdrag:

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