Możliwe jest automatyczne wywoływanie operacji w aplikacji po odebraniu przez odtwarzacz określonych metadanych lub osiągnięciu określonych punktów sygnalizacji. Aby mechanizm ten działał, konieczne jest napisanie metod wywołania zwrotnego pełniących rolę funkcji obsługi zdarzeń. Klasa NetStream zawiera następujące zdarzenia powiązane z metadanymi, jakie mogą zachodzić w trakcie odtwarzania:
onCuePoint
(tylko pliki FLV),
onImageData
,
onMetaData
,
onPlayStatus
onTextData
i
onXMPData
.
W wypadku braku metod wywołania zwrotnego obsługujących te zdarzenia środowisko wykonawcze Flash może zgłaszać błędy. Na przykład poniższy kod odtwarza plik FLV o nazwie video.flv znajdujący się w tym samym folderze, co plik SWF:
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);
Powyższy kod ładuje lokalny plik wideo o nazwie video.flv i wykrywa zdarzenia
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
). Zdarzenie to jest wywoływane, gdy natywny kod asynchroniczny wygeneruje wyjątek. W tym przypadku zdarzenie jest wywoływane, gdy plik wideo zawiera metadane lub dane punktów sygnalizacji, a nie zdefiniowano odpowiednich detektorów zdarzeń. Przykładowy kod przedstawiony powyżej obsługuje zdarzenie
asyncError
i ignoruje błąd, jeśli nie jesteśmy zainteresowani metadanymi pliku ani danymi punktów sygnalizacji. Gdyby plik FLV zawierał metadane i kilka punktów sygnalizacji, funkcja
trace()
wyświetliłaby następujące komunikaty o błędach:
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.
Błędy występują, ponieważ obiekt NetStream nie może znaleźć metody wywołania zwrotnego
onMetaData
ani
onCuePoint
. Istnieje kilka sposobów definiowania tych metod wywołania zwrotnego w aplikacjach.
Ustawianie właściwości client obiektu NetStream na klasę Object
Przypisując właściwości
client
klasę Object lub podklasę klasy NetStream, można przekierować wywołania zwrotne metod
onMetaData
i
onCuePoint
lub całkowicie zignorować te wywołania. Poniższy przykład ilustruje użycie pustego obiektu Object w celu zignorowania wywołań zwrotnych bez konieczności wykrywania zdarzenia
asyncError
:
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);
Jeśli chcemy wykrywać wywołania zwrotne metody
onMetaData
lub
onCuePoint
, musimy zdefiniować te metody, co ilustruje poniższy urywek kodu:
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
function metaDataHandler(infoObject:Object):void
{
trace("metadata");
}
Powyższy kod wykrywa wywołanie zwrotne metody
onMetaData
i wywołuje metodę
metaDataHandler()
, która wyświetla ciąg znaków. Gdyby środowisko wykonawcze Flash napotkało punkt synchronizacji, nie zostałyby zgłoszone żadne błędy, mimo że nie zdefiniowano metody wywołania zwrotnego
onCuePoint
.
Tworzenie własnej klasy i definiowane metod obsługi wywołań zwrotnych
Poniższy kod przypisuje właściwości
client
obiektu NetStream klasę niestandardową, CustomClient, w której są zdefiniowane metody obsługi wywołań zwrotnych
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);
Klasa CustomClient jest zdefiniowana w następujący sposób:
package
{
public class CustomClient
{
public function onMetaData(infoObject:Object):void
{
trace("metadata");
}
}
}
W klasie CustomClient zdefiniowana jest metoda obsługi wywołania zwrotnego
onMetaData
. W razie napotkania punktu sygnalizacji i wywołania metody obsługi wywołania zwrotnego
onCuePoint
zostałoby wygenerowane zdarzenie
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
) z informacją „flash.net.NetStream was unable to invoke callback onCuePoint” (flash.net.NetStream nie mógł wywołać funkcji wywołania zwrotnego onCuePoint). Aby zapobiec wystąpieniu tego błędu, należy zdefiniować metodę wywołania zwrotnego
onCuePoint
we własnej klasie CustomClient lub zdefiniować funkcję obsługi zdarzenia
asyncError
.
Rozszerzenie klasy NetStream i dodanie metod do obsługi wywołań zwrotnych
Poniższy kod tworzy instancję klasy CustomNetStream zdefiniowanej we fragmencie kodu zamieszczonym poniżej.
var ns:CustomNetStream = new CustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
W poniższym fragmencie kodu zdefiniowano klasę CustomNetStream, która rozszerza klasę NetStream, tworzy niezbędny obiekt NetConnection i obsługuje wywołania zwrotne metod
onMetaData
i
onCuePoint
:
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");
}
}
}
W celu zmiany nazw metod
onMetaData()
i
onCuePoint()
w klasie CustomNetStream można byłoby użyć poniższego kodu:
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");
}
}
}
Rozszerzenie klasy NetStream i przekształcenie jej w klasę dynamiczną
Możliwe jest rozszerzenie klasy NetStream i utworzenie podklasy dynamicznej, tak aby możliwe było dynamiczne dodawanie metod wywołania zwrotnego
onCuePoint
i
onMetaData
. Ilustruje to poniższy fragment kodu:
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
Klasa DynamicCustomNetStream jest zdefiniowana w następujący sposób:
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);
}
}
}
Nawet jeśli metody wywołania zwrotnego
onMetaData
i
onCuePoint
nie zostaną zdefiniowane, błędy nie będą zgłaszane, ponieważ klasa DynamicCustomNetStream jest dynamiczna. W celu zdefiniowania metod do obsługi wywołań zwrotnych
onMetaData
i
onCuePoint
można skorzystać z poniższego kodu:
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");
}
Ustawienie właściwości client obiektu NetStream na wartość this
Przypisanie właściwości
client
wartości
this
powoduje, że aplikacja poszukuje metod
onMetaData()
i
onCuePoint()
w bieżącym zasięgu. Ilustruje to poniższy przykład:
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);
Wywołania zwrotne
onMetaData
lub
onCuePoint
w sytuacji, gdy nie istnieją metody obsługi tych wywołań, nie powodują generowania błędów. Aby obsługiwać te wywołania zwrotne, należy utworzyć w kodzie metody
onMetaData()
i
onCuePoint()
, co ilustruje poniższy urywek kodu:
function onMetaData(infoObject:Object):void
{
trace("metadata");
}
function onCuePoint(infoObject:Object):void
{
trace("cue point");
}