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