為中繼資料和提示點撰寫回呼方法

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

您可以在到達特定提示點或是播放程式收到特定中繼資料時,在應用程式中觸發動作。當這些事件發生時,您必須使用特定的回呼方法做為事件處理常式。NetStream 類別會指定可能在播放期間發生的下列中繼資料事件:onCuePoint (僅限 FLV 檔)、onImageDataonMetaDataonPlayStatusonTextDataonXMPData

您必須為這些處理常式撰寫回呼方法,否則 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 物件無法找到 onMetaDataonCuePoint 回呼方法,所以會發生這個錯誤。在應用程式中定義這些回呼方法有多種方式。

將 NetStream 物件的 client 屬性設定為 Object

透過將 client 屬性設定為 Object 或 NetStream 的子類別,您可以重新遞送 onMetaDataonCuePoint 回呼方法,或是完全忽略它們。下列範例將示範您如何使用空的 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);

如果您想要偵聽 onMetaDataonCuePoint 回呼方法,就必須定義方法以處理這些回呼方法,如下列程式碼片段所示:

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 物件的建立作業,並處理 onMetaDataonCuePoint 回呼處理常式方法:

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 類別並使子類別成為動態類別,這樣就能以動態方式增加 onCuePointonMetaData 回呼處理常式。這會在下列程式碼中說明:

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 是動態類別,所以即使 onMetaDataonCuePoint 回呼處理常式沒有處理常式,也不會擲出錯誤。如果您要為 onMetaDataonCuePoint 回呼處理常式定義方法,可以使用下列程式碼:

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

如果呼叫 onMetaDataonCuePoint 回呼處理常式,但是沒有方法可處理回呼,則不會產生任何錯誤。若要處理這些回呼處理常式,請在程式碼中建立 onMetaData()onCuePoint() 方法,如下列程式碼片段所示:

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