使用提示點

提示點是指在視訊檔播放的同時,視訊播放程式傳送 cuePoint 事件的點。您可以在 FLV 檔中加入提示點,讓網頁上的其它元素在這些時間點發生某個動作。例如,您可能想要顯示文字或圖形或同步化 Flash 動畫,或者透過暫停 FLV 檔、搜尋視訊中的不同時間點或切換至不同的 FLV 檔,以影響 FLV 檔的播放。提示點可讓您經由 ActionScript 程式碼接手控制權,並將 FLV 檔中的時間點與網頁上的其它動作同步化。

提示點共有三種:瀏覽、事件和 ActionScript。瀏覽和事件提示點也稱為「內嵌」提示點,因為這兩種提示點都內嵌於 FLV 檔串流和 FLV 檔的中繼資料封包。

「瀏覽提示點」會在 FLV 檔內建立最接近您所指定之時間的關鍵影格,讓您可以在 FLV 檔中搜尋特定影格。「關鍵影格」是 FLV 檔串流中影像影格之間出現的資料段落。當您搜尋瀏覽提示點時,組件便會搜尋關鍵影格並啟動 cuePoint 事件。

「事件提示點」讓您能夠將 FLV 檔內的某個時間點與網頁上的外部事件同步化。 cuePoint 事件會精確地發生在特定時間。您可以利用「視訊匯入」精靈或 Flash Video Encoder,將瀏覽和事件提示點內嵌到 FLV 檔中。如需有關「視訊匯入」精靈和 Flash Video Encoder 的詳細資訊,請參閱「使用 Flash」中的第 16 章「使用視訊」。

「ActionScript 提示點」是外部提示點,您可以透過組件的「Flash 視訊提示點」對話方塊或 FLVPlayback.addASCuePoint() 方法加入。組件會將 ActionScript 提示點儲存在 FLV 檔以外的地方,然後再進行追蹤,因此,這些提示點不如內嵌提示點般精確。ActionScript 提示點的精確度為十分之一秒。由於組件會在播放磁頭更新時產生 ActionScript 提示點 cuePoint 事件,因此,您可藉由降低 playheadUpdateInterval 屬性的值,提高 ActionScript 提示點的精確度。如需詳細資訊,請參閱 Adobe®·Flash®·Professional·CS5·的·ActionScript®·3.0·參考 中的·FLVPlayback.playheadUpdateInterval 屬性。

在 ActionScript 和 FLV 檔的中繼資料內,提示點會以具有下列屬性的物件來表示: name time type parameters name 屬性是包含所指定之提示點名稱的字串。 time 屬性是以小時、分鐘、秒和毫秒 (HH:MM:SS.mmm) 表示提示點發生時間的數字。 type 屬性是根據您所建立的提示點類型而定,具有 "navigation" "event" "actionscript" 值的字串。 parameters 屬性是所指定之名稱和值配對的陣列。

cuePoint 事件發生時,透過 info 屬性便可從事件物件中取用提示點物件。

使用 Flash 視訊提示點對話方塊

在「組件檢測器」中按兩下 cuePoints 參數的「值」儲存格,以開啟「Flash 視訊提示點」對話方塊。這個對話方塊看起來像下圖:

檢視完整大小的圖形
「Flash 視訊提示點」對話方塊

對話方塊中會顯示內嵌提示點和 ActionScript 提示點。您可以使用這個對話方塊來新增和刪除 ActionScript 提示點以及提示點參數,也可以啟用或停用內嵌提示點。不過,您無法新增、變更或刪除內嵌提示點。

新增 ActionScript 提示點:

  1. 在「組件檢測器」中按兩下 cuePoints 參數的值儲存格,以開啟「Flash 視訊提示點」對話方塊。

  2. 在提示點清單上方,按一下左上角的加號 (+),以新增預設 ActionScript 提示點項目。

  3. 按一下「名稱」欄中的「新提示點」文字並加以編輯,為提示點命名。

  4. 按一下 00:00:00:000 的「時間」值並加以編輯,指定提示點發生的時間。您可以使用小時、分鐘、秒和毫秒 (HH:MM:SS.mmm) 來指定時間。

    如果有多個提示點,對話方塊就會按照時間優先順序將新的提示點放入清單中。

  5. 若要為選取的提示點新增參數,請按一下「參數」區域上方的加號 (+),並在「名稱」和「值」欄中輸入值。針對每個參數重複執行這個步驟。

  6. 若要新增更多 ActionScript 提示點,請針對每個提示點重複執行步驟 2 到 5。

  7. 按一下「確定」儲存變更。

刪除 ActionScript 提示點:

  1. 在「組件檢測器」中按兩下 cuePoints 參數的值儲存格,以開啟「Flash 視訊提示點」對話方塊。

  2. 選取您要刪除的提示點。

  3. 在提示點清單上方,按一下左上角的減號 (-) 加以刪除。

  4. 針對每個要刪除的提示點重複執行步驟 2 和 3。

  5. 按一下「確定」儲存變更。

啟用或停用內嵌 FLV 檔的提示點:

  1. 在「組件檢測器」中按兩下 cuePoints 參數的值儲存格,以開啟「Flash 視訊提示點」對話方塊。

  2. 選取您要啟用或停用的提示點。

  3. 按一下「類型」欄中的值以觸發彈出式選單,或按一下向下箭頭。

  4. 按一下提示點類型名稱 (例如「事件」或「瀏覽」) 加以啟用。按一下「停用」加以停用。

  5. 按一下「確定」儲存變更。

透過 ActionScript 使用提示點

您可以利用 ActionScript 來新增 ActionScript 提示點、偵聽 cuePoint 事件、尋找任何類型或特定類型的提示點、搜尋瀏覽提示點、啟用或停用提示點、確認提示點是否已啟用以及移除提示點。

本節中的範例使用名為 cuepoints.flv 的 FLV 檔,這個檔案包含下列三個提示點:

名稱

時間

類型

point1

00:00:00.418

瀏覽

point2

00:00:07.748

瀏覽

point3

00:00:16.020

瀏覽

新增 ActionScript 提示點

您可以使用 addASCuePoint() 方法,在 FLV 檔中新增 ActionScript 提示點。下列範例會在已準備要播放的 FLV 檔中新增兩個 ActionScript 提示點。此範例使用提示點物件來新增第一個提示點,並透過物件屬性指定提示點的時間、名稱和類型。第二個呼叫會使用方法的 time name 參數來指定時間和名稱。

// Requires an FLVPlayback instance called my_FLVPlybk on Stage 
import fl.video.*; 
import fl.video.MetadataEvent; 
my_FLVPlybk.source = "http://www.helpexamples.com/flash/video/cuepoints.flv" 
var cuePt:Object = new Object(); //create cue point object 
cuePt.time = 2.02; 
cuePt.name = "ASpt1"; 
cuePt.type = "actionscript"; 
my_FLVPlybk.addASCuePoint(cuePt);//add AS cue point 
// add 2nd AS cue point using time and name parameters 
my_FLVPlybk.addASCuePoint(5, "ASpt2"); 

如需詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.addASCuePoint() 方法。

偵聽 cuePoint 事件

cuePoint 事件可讓您在 cuePoint 事件發生時,經由 ActionScript 程式碼接手控制權。當下列範例中的提示點發生時, cuePoint 偵聽程式會呼叫事件處理常式函數,以顯示 playheadTime 屬性的值以及提示點的名稱和類型。將此範例與上一節「新增 ActionScript 提示點」中的範例搭配使用,即可查看結果。

my_FLVPlybk.addEventListener(MetadataEvent.CUE_POINT, cp_listener); 
function cp_listener(eventObject:MetadataEvent):void { 
        trace("Elapsed time in seconds: " + my_FLVPlybk.playheadTime); 
        trace("Cue point name is: " + eventObject.info.name); 
        trace("Cue point type is: " + eventObject.info.type); 
}

如需有關 cuePoint 事件的詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.cuePoint 事件。

尋找提示點

您可以使用 ActionScript 來尋找任何類型的提示點、最接近某個時間的提示點或具有特定名稱的下一個提示點。

下列範例中的 ready_listener() 事件處理常式會呼叫 findCuePoint() 方法來尋找提示點 ASpt1 ,接著呼叫 findNearestCuePoint() 方法來尋找最接近提示點 ASpt1 時間的瀏覽提示點:

import fl.video.FLVPlayback; 
import fl.video.CuePointType; 
import fl.video.VideoEvent; 
my_FLVPlybk.source = "http://www.helpexamples.com/flash/video/cuepoints.flv" 
var rtn_obj:Object; //create cue point object 
my_FLVPlybk.addASCuePoint(2.02, "ASpt1");//add AS cue point 
function ready_listener(eventObject:VideoEvent):void { 
    rtn_obj = my_FLVPlybk.findCuePoint("ASpt1", CuePointType.ACTIONSCRIPT); 
    traceit(rtn_obj); 
    rtn_obj = my_FLVPlybk.findNearestCuePoint(rtn_obj.time, CuePointType.NAVIGATION); 
    traceit(rtn_obj); 
} 
my_FLVPlybk.addEventListener(VideoEvent.READY, ready_listener); 
function traceit(cuePoint:Object):void { 
    trace("Cue point name is: " + cuePoint.name); 
    trace("Cue point time is: " + cuePoint.time); 
    trace("Cue point type is: " + cuePoint.type); 
}

下列範例中的 ready_listener() 事件處理常式會尋找提示點 ASpt ,並呼叫 findNextCuePointWithName() 方法尋找具有相同名稱的下一個提示點:

import fl.video.*; 
my_FLVPlybk.source = "http://www.helpexamples.com/flash/video/cuepoints.flv" 
var rtn_obj:Object; //create cue point object 
my_FLVPlybk.addASCuePoint(2.02, "ASpt");//add AS cue point 
my_FLVPlybk.addASCuePoint(3.4, "ASpt");//add 2nd Aspt 
my_FLVPlybk.addEventListener(VideoEvent.READY, ready_listener); 
function ready_listener(eventObject:VideoEvent):void { 
    rtn_obj = my_FLVPlybk.findCuePoint("ASpt", CuePointType.ACTIONSCRIPT); 
    traceit(rtn_obj); 
    rtn_obj = my_FLVPlybk.findNextCuePointWithName(rtn_obj); 
    traceit(rtn_obj); 
} 
function traceit(cuePoint:Object):void { 
    trace("Cue point name is: " + cuePoint.name); 
    trace("Cue point time is: " + cuePoint.time); 
    trace("Cue point type is: " + cuePoint.type); 
}

如需有關尋找提示點的詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.findCuePoint()、FLVPlayback.findNearestCuePoint() 以及 FLVPlayback.findNextCuePointWithName() 方法。

搜尋瀏覽提示點

您可以搜尋瀏覽提示點、從特定時間搜尋下一個瀏覽提示點,以及從特定時間搜尋上一個瀏覽提示點。下列範例會播放 FLV 檔 cuepoints.flv,並在 ready 事件發生時,搜尋位於 7.748 的提示點。當 cuePoint 事件發生時,這個範例會呼叫 seekToPrevNavCuePoint() 方法來搜尋第一個提示點。在該 cuePoint 事件發生時,此範例會呼叫 seekToNextNavCuePoint() 方法,透過將 eventObject.info.time (目前提示點的時間) 增加 10 秒的方式,搜尋最後一個提示點。

import fl.video.*; 
 
my_FLVPlybk.addEventListener(VideoEvent.READY, ready_listener); 
function ready_listener(eventObject:Object):void { 
    my_FLVPlybk.seekToNavCuePoint("point2"); 
} 
my_FLVPlybk.addEventListener(MetadataEvent.CUE_POINT, cp_listener); 
function cp_listener(eventObject:MetadataEvent):void { 
    trace(eventObject.info.time); 
    if(eventObject.info.time == 7.748) 
        my_FLVPlybk.seekToPrevNavCuePoint(eventObject.info.time - .005); 
    else 
        my_FLVPlybk.seekToNextNavCuePoint(eventObject.info.time + 10); 
} 
my_FLVPlybk.source = "http://helpexamples.com/flash/video/cuepoints.flv";

如需詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.seekToNavCuePoint()、FLVPlayback.seekToNextNavCuePoint() 以及 FLVPlayback.seekToPrevNavCuePoint() 方法。

啟用和停用內嵌 FLV 檔的提示點

您可以使用 setFLVCuePointEnabled() 方法,啟用和停用內嵌 FLV 檔的提示點。停用的提示點不會觸發 cuePoint 事件,也不會使用 seekToCuePoint() seekToNextNavCuePoint() seekToPrevNavCuePoint() 方法。不過,您還是可以利用 findCuePoint() findNearestCuePoint() findNextCuePointWithName() 方法來尋找停用的提示點。

您可以使用 isFLVCuePointEnabled() 方法來測試內嵌 FLV 檔的提示點是否已啟用。下列範例會在視訊準備好要播放時,停用內嵌提示點 point2 point3 。不過,當第一個 cuePoint 事件發生時,事件處理常式會進行測試,以查看提示點 point3 是否已停用,若停用了,便會加以啟用。

import fl.video.*; 
my_FLVPlybk.source = "http://www.helpexamples.com/flash/video/cuepoints.flv"; 
my_FLVPlybk.addEventListener(VideoEvent.READY, ready_listener); 
function ready_listener(eventObject:VideoEvent):void { 
    my_FLVPlybk.setFLVCuePointEnabled(false, "point2"); 
    my_FLVPlybk.setFLVCuePointEnabled(false, "point3"); 
} 
my_FLVPlybk.addEventListener(MetadataEvent.CUE_POINT, cp_listener); 
function cp_listener(eventObject:MetadataEvent):void { 
        trace("Cue point time is: " + eventObject.info.time); 
        trace("Cue point name is: " + eventObject.info.name); 
        trace("Cue point type is: " + eventObject.info.type); 
        if (my_FLVPlybk.isFLVCuePointEnabled("point2") == false) { 
            my_FLVPlybk.setFLVCuePointEnabled(true, "point2"); 
        } 
}

如需詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.isFLVCuePointEnabled() 和 FLVPlayback.setFLVCuePointEnabled() 方法。

移除 ActionScript 提示點

您可以使用 removeASCuePoint() 方法來移除 ActionScript 提示點。下列範例會在提示點 ASpt1 發生時,移除提示點 ASpt2

import fl.video.*; 
my_FLVPlybk.source = "http://www.helpexamples.com/flash/video/cuepoints.flv" 
my_FLVPlybk.addASCuePoint(2.02, "ASpt1");//add AS cue point 
my_FLVPlybk.addASCuePoint(3.4, "ASpt2");//add 2nd Aspt 
my_FLVPlybk.addEventListener(MetadataEvent.CUE_POINT, cp_listener); 
function cp_listener(eventObject:MetadataEvent):void { 
        trace("Cue point name is: " + eventObject.info.name); 
        if (eventObject.info.name == "ASpt1") { 
            my_FLVPlybk.removeASCuePoint("ASpt2");     
            trace("Removed cue point ASpt2"); 
        } 
}

如需詳細資訊,請參閱 適用於 Adobe Flash Platform 的 ActionScript 3.0 參考 中的 FLVPlayback.removeASCuePoint()。