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