Pisanie metod wywołania zwrotnego do obsługi metadanych i punktów sygnalizacji

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

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