Oynatıcı tarafından belirli meta veriler alındığında veya belirli işaret noktalarına ulaşıldığında uygulamanızda eylemleri tetikleyebilirsiniz. Bu olaylar gerçekleştiğinde, belirli geri çağrı yöntemlerini olay işleyicileri olarak kullanmanız gerekir. NetStream sınıfı, oynatma sırasında oluşabilecek şu meta veri olaylarını belirtir:
onCuePoint
(yalnızca FLV dosyaları),
onImageData
,
onMetaData
,
onPlayStatus
,
onTextData
ve
onXMPData
.
Bu işleyiciler için geri çağrı yöntemleri yazmanız gerekir, aksi takdirde Flash çalışma zamanı hata atabilir. Örneğin, şu kod SWF dosyasının bulunduğu aynı klasörde video.flv adında bir FLV dosyasını oynatır:
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);
Önceki kod, video.flv adında yerel bir video yükler ve gönderilecek
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
) öğesini dinler. Yerel eşzamansız koddan bir istisna atıldığında bu olay gönderilir. Bu durumda, video dosyası meta veri veya işaret noktası bilgileri içerdiğinde ve uygun dinleyiciler tanımlanmamış olduğunda gönderilir. Önceki kod,
asyncError
olayını işler ve siz video dosyasının meta veri veya işaret noktası bilgileriyle ilgilenmiyorsanız hatayı yok sayar. Meta veri ve birçok işaret noktası içeren bir FLV dosyanız varsa,
trace()
işlevi şu hata mesajlarını görüntüler:
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 nesnesi,
onMetaData
veya
onCuePoint
geri çağrı yöntemini bulamadığından hatalar gerçekleşir. Uygulamalarınızda bu geri çağrı yöntemlerini tanımlamanın birçok yolu vardır.
NetStream nesnesinin istemci özelliğini bir Object öğesine ayarlama
client
özelliğini bir Object öğesine veya NetStream öğesinin alt sınıfına ayarlayarak,
onMetaData
ve
onCuePoint
geri çağrı yöntemlerini yeniden yönlendirebilir ya da tamamen yoksayabilirsiniz. Şu örnek,
asyncError
olayını dinlemeden geri çağrı yöntemlerini yoksaymak için boş bir Object öğesini nasıl kullanabileceğinizi gösterir:
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
veya
onCuePoint
geri çağrı yöntemlerini dinlemek isterseniz, aşağıdaki kod parçasında gösterildiği gibi, bu geri çağrı yöntemlerini işlemek için yöntemler tanımlamanız gerekir:
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
function metaDataHandler(infoObject:Object):void
{
trace("metadata");
}
Önceki kod,
onMetaData
geri çağrı yöntemini dinler ve bir dizeyi izleyen
metaDataHandler()
yöntemini çağırır. Flash çalışma zamanı bir işaret noktasıyla karşılaşırsa, herhangi bir
onCuePoint
geri çağrı yöntemi tanımlanmamış olsa da, hata oluşturulmaz.
Özel bir sınıf oluşturma ve geri çağrı yöntemlerini işlemek için yöntemleri tanımlama
Şu kod, NetStream nesnesinin
client
özelliğini özel bir sınıf olan CustomClient sınıfına ayarlar ve böylece geri çağrı yöntemleri için işleyiciler tanımlanır:
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 sınıfı şöyledir:
package
{
public class CustomClient
{
public function onMetaData(infoObject:Object):void
{
trace("metadata");
}
}
}
CustomClient sınıfı,
onMetaData
geri çağrı işleyicisi için bir işleyici tanımlar. Bir işaret noktasıyla karşılaşıldıysa ve
onCuePoint
geri çağrı işleyicisi çağrıldıysa, bir
asyncError
olayı (
AsyncErrorEvent.ASYNC_ERROR
) gönderilerek “flash.net.NetStream, onCuePoint geri çağrısını çağıramadı.” mesajını bildirir. Bu hatayı önlemek için, CustomClient sınıfınızda bir
onCuePoint
geri çağrı yöntemini tanımlamanız veya
asyncError
olayı için bir olay işleyicisi tanımlamanız gerekir.
NetStream sınıfını genişletme ve geri çağrı yöntemlerini işlemek için yöntemler ekleme
Şu kod, daha sonra bir kod listesinde tanımlanan, CustomNetStream sınıfının bir örneğini oluşturur:
var ns:CustomNetStream = new CustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
Şu kod listesi, NetStream sınıfını genişleten, gerekli NetConnection nesnesinin oluşumunu işleyen ve
onMetaData
ve
onCuePoint
geri çağrı işleyici yöntemlerini işleyen CustomNetStream sınıfını tanımlar:
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");
}
}
}
CustomNetStream sınıfında
onMetaData()
ve
onCuePoint()
yöntemlerini yeniden adlandırmak isterseniz, şu kodu kullanabilirsiniz:
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 sınıfını genişletme ve dinamik hale getirme
NetStream sınıfını genişletebilir ve
onCuePoint
ve
onMetaData
geri çağrı işleyicileri dinamik olarak eklenebilecek şekilde alt sınıfı dinamik duruma getirebilirsiniz. Aşağıdaki listede bu gösterilmektedir:
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
DynamicCustomNetStream sınıfı şöyledir:
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
ve
onCuePoint
geri çağrı işleyicileri için herhangi bir işleyici olmadığında da, DynamicCustomNetStream sınıfı dinamik olduğundan hata atılmaz.
onMetaData
ve
onCuePoint
geri çağrı işleyicileri için yöntemleri tanımlamak istiyorsanız, şu kodu kullanabilirsiniz:
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");
}
NetStream nesnesinin istemci özelliğini this olarak ayarlama
client
özelliği
this
olarak ayarlandığında, uygulama
onMetaData()
ve
onCuePoint()
yöntemlerinin geçerli kapsamında arama yapar. Aşağıdaki örnekte bunu görebilirsiniz:
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
veya
onCuePoint
geri çağrı işleyicileri çağrılırsa ve geri çağrıyı işleyecek bir yöntem yoksa herhangi bir hata oluşturulmaz. Bu geri çağrı işleyicilerini işlemek için, aşağıdaki kod parçasında görüldüğü gibi bir
onMetaData()
ve
onCuePoint()
yöntemi oluşturun:
function onMetaData(infoObject:Object):void
{
trace("metadata");
}
function onCuePoint(infoObject:Object):void
{
trace("cue point");
}