為中繼資料和提示點撰寫回呼方法
Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本
您可以在到達特定提示點或是播放程式收到特定中繼資料時,在應用程式中觸發動作。當這些事件發生時,您必須使用特定的回呼方法做為事件處理常式。NetStream 類別會指定可能在播放期間發生的下列中繼資料事件:onCuePoint (僅限 FLV 檔)、onImageData、onMetaData、onPlayStatus、onTextData 和 onXMPData。
您必須為這些處理常式撰寫回呼方法,否則 Flash 執行階段可能會擲出錯誤。例如,下列程式碼會播放與 SWF 檔位於相同資料夾中的 video.flv 檔:
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 回呼方法,所以會發生這個錯誤。在應用程式中定義這些回呼方法有多種方式。
將 NetStream 物件的 client 屬性設定為 Object
透過將 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 回呼方法,仍然不會產生錯誤。
建立自訂類別並定義方法以處理回呼方法
下列程式碼會將 NetStream 物件的 client 屬性設定為自訂類別 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 無法叫用回呼 onCuePoint」。若要避免此錯誤,您就必須在 CustomClient 類別中定義 onCuePoint 回呼方法,或是為 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");
}
}
}
如果您要在 CustomNetStream 類別中重新命名 onMetaData() 與 onCuePoint() 方法,可以使用下列程式碼:
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);
}
}
}
因為 DynamicCustomNetStream 是動態類別,所以即使 onMetaData 與 onCuePoint 回呼處理常式沒有處理常式,也不會擲出錯誤。如果您要為 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");
}
將 NetStream 物件的 client 屬性設定成 this
透過將 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");
}