2011-02-03 17 views
0

在我開始播放電影,我添加了一對夫婦的提示點,然後註冊回調,並跟蹤每次它被擊中,就像這樣:早期的ActionScript電影提示點觸發太晚

private function onCuePoint(evt:CuePointEvent):void { 
     var cuePointObject:Object = {name:evt.cuePointName, time:evt.cuePointTime, type:evt.cuePointType};   

     trace("onCuePoint: " + evt.cuePointName + "=" + cueDict[evt.cuePointName] + " @t=" + cuePointObject.time + " playtime=" + playheadTime); 
    } 

你」 d認爲cuePointObject.time將大致等於電影的播放頭時間。下面是輸出:

onCuePoint: cue3.4=cue3.4 @t=5.6 playtime=5.611 
onCuePoint: cue1=cue1 @t=1 playtime=5.611 
onCuePoint: cue2=cue2 @t=3 playtime=5.611 
onCuePoint: cue2=cue2 @t=5 playtime=5.611 
onCuePoint: cue3.1=cue3.1 @t=5 playtime=5.611 
onCuePoint: cue3.1=cue3.1 @t=5.2 playtime=5.611 
onCuePoint: cue3.2=cue3.2 @t=5.2 playtime=5.611 
onCuePoint: cue3.2=cue3.2 @t=5.4 playtime=5.611 
onCuePoint: cue3.3=cue3.3 @t=5.4 playtime=5.611 
onCuePoint: cue3.3=cue3.3 @t=5.6000000000000005 playtime=5.611 
onCuePoint: cue3.4=cue3.4 @t=5.8 playtime=5.888 
onCuePoint: cue3.5=cue3.5 @t=5.8 playtime=5.888 
onCuePoint: cue4=cue4 @t=10 playtime=9.92 
onCuePoint: cue1=cue1 @t=11 playtime=11.221 

看起來好像它一直等待,直到「cue3.4」被觸發,然後剩下的遵循某種原因。它們以數組的形式添加到視頻中,大致按照它們出現的順序排序,所以cue3.4不是第一個。

+0

動作提示點並不總是可靠的。如果你可以使用嵌入的提示點,那會很好。如果你正在使用動作提示點,但他們不適合你的工作,也許你可以使用Timer類(多個實例,或者一個單一的實例,你會更新與時間值數組之間的相對時間) – 2011-02-03 09:57:37

回答

0

我在調試一段時間後發現問題,所以我在這裏發佈解決方案,以防其他人絆倒它。

這是Flex中的一個錯誤,我使用的是v3.6,但我不知道它是否已被修復。當將提示添加到CuePointManager中時,它會根據提示的時間進行插入排序。然而,在算法的一個點便將這樣的數字:

var compTime1:Number = Math.round(time * 1000); 
var compTime2:Number = Math.round(cuePoint.time * 1000); 

再後來,它會檢查該指數的比較方法返回(在那裏說的線索應該得到插入),而不使用四捨五入:

index = getCuePointIndex(cuePoints, true, copy.time, null, 0, 0); 
index = (cuePoints[index].time > copy.time) ? 0 : index + 1; 

我3.3在5.6000000000000005觸發的提示具有該值,因爲浮點錯誤 - 我已經添加了0.2到5.4。所以雖然getCuePointIndex返回正確的索引,然後它被設置爲在第二行,把它放在第一個列表中。

我的解決方法是簡單地做的線索時代自己的舍入之前,我將它們添加:

trace("pushing cue " + c.id + "@"+ c.time + " - " + ((c.time + c.duration) * 1000)/1000); 
cuePointArr.push({name:c.id + "_start", time:Math.round(c.time * 1000)/1000,    type:"actionscript"}); 
cuePointArr.push({name:c.id + "_stop", time:Math.round((c.time + c.duration) * 1000)/1000, type:"actionscript"}); 

(注:因爲我已經添加了‘_start’和‘_stop’的部分,因爲我有有兩個線索同名的問題)

希望這可以幫助別人!