Написание методов обратного вызова для метаданных и ключевых точек

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

В приложении можно запускать различные действия, когда проигрыватель получает определенные метаданные или достигает определенной ключевой точки. Когда происходят эти события, для их обработки необходимо использовать специальные методы обратного вызова. Класс NetStream определяет следующие события метаданных, которые могут происходить в процессе воспроизведения: onCuePoint (только для FLV-файлов), onImageData , onMetaData , onPlayStatus , onTextData и onXMPData .

Для этих обработчиков необходимо написать методы обратного вызова, иначе в среде выполнения Flash могут возникать ошибки. Например, следующий код воспроизводит FLV-файл с именем video.flv, который находится в той же папке, что и 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);

Предыдущий код загружает локальный видеофайл с именем video.flv и прослушивает событие asyncError ( AsyncErrorEvent.ASYNC_ERROR ). Это событие отправляется, когда собственный асинхронный код выдает исключение. В данном случае оно отправляется, когда видеофайл содержит метаданные или данные ключевой точки, но соответствующие прослушиватели не определены. Предыдущий код обрабатывает событие asyncError и игнорирует ошибку, если вы не заинтересованы в метаданных или ключевых точках, имеющихся в видеофайле. Если FLV-файл имеет метаданные и несколько ключевых точек, то метод trace() отобразит следующие сообщения об ошибках:

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.

Ошибки происходят, так как объект NetStream не может найти метод обратного вызова onMetaData или onCuePoint . Определить методы обратного вызова в приложении можно несколькими способами.

Назначение экземпляра Object свойству client объекта NetStream

Если задать свойству client экземпляр класса Object или подкласса NetStream, можно изменить маршрут методов обратного вызова onMetaData и onCuePoint или полностью их игнорировать. Следующий пример демонстрирует, как с помощью пустого экземпляра Object можно игнорировать методы обратного вызова, не прослушивая событие 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);

Если требуется прослушивать метод обратного вызова onMetaData или onCuePoint , необходимо определить методы для его обработки, как показано в следующем примере.

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

Предыдущий код прослушивает метод обратного вызова onMetaData и вызывает метод metaDataHandler() , который отслеживает строку. Когда среда выполнения Flash находит ключевые точки, то ошибки не создаются, даже если не определен метод обратного вызова onCuePoint .

Создание пользовательского класса и определение методов для обработки методов обратного вызова

Следующий код задает свойству client объекта NetStream пользовательский класс, CustomClient, который определяет обработчики для методов обратного вызова.

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

Определение класса CustomClient выглядит следующим образом:

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

Класс CustomClient определяет обработчика для метода обратного вызова onMetaData . Когда встречается ключевая точка и вызывается метод обратного вызова onCuePoint , отправляется событие asyncError ( AsyncErrorEvent.ASYNC_ERROR ) со строкой «flash.net.NetStream was unable to invoke callback onCuePoint» (Метод flash.net.NetStream не смог вызвать метод обратного вызова onCuePoint). Чтобы предотвратить эту ошибку, нужно определить метод обратного вызова onCuePoint в классе CustomClient или определить обработчик для события asyncError .

Расширение класса NetStream и добавление методов для обработки функций обратного вызова

Следующий код создает экземпляр класса CustomNetStream, который определяется в другом коде.

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

Следующий код определяет класс CustomNetStream, расширяющий класс NetStream, создает необходимый объект NetConnection и обрабатывает методы обратного вызова onMetaData и 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"); 
        } 
    } 
}

Если требуется переименовать методы onMetaData() и onCuePoint() в классе CustomNetStream, нужно использовать следующий код:

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

Расширение класса NetStream и превращение его в динамический класс

Можно расширить класс NetStream и сделать его подкласс динамическим, чтобы обработчики обратного вызова onCuePoint и onMetaData добавлялись динамически. Это демонстрируется в следующем примере.

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

Определение класса 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); 
        } 
    } 
}

Даже если нет обработчиков для методов обратного вызова onMetaData и onCuePoint , ошибки не генерируются, так как класс DynamicCustomNetStream является динамическим. Если требуется определить методы для обработчиков обратного вызова onMetaData и onCuePoint , можно использовать следующий код:

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

Назначение this свойству client объекта NetStream

Если задать свойству client значение this , приложение ищет методы onMetaData() и onCuePoint() в текущей области действия. Это демонстрируется в следующем примере.

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

Если вызываются обработчики обратного вызова onMetaData и onCuePoint и нет методов для их обработки, ошибки не генерируются. Чтобы обработать эти методы обратного вызова, создайте в коде методы onMetaData() и onCuePoint() , как показано в следующем примере:

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