早期的ActionScript电影提示点触发太晚了

时间:2011-02-03 09:41:08

标签: actionscript-3 flex3 cue

在我开始播放电影之前,我添加了几个提示点,然后注册回调,并在每次命中时跟踪,如下所示:

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

你认为 cuePointObject.time 大致等于电影的 playheadTime 。这是输出:

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不是第一个。

1 个答案:

答案 0 :(得分:0)

我在调试一段时间后发现问题,所以我在这里发布解决方案以防万一其他人偶然发现它。

这是Flex中的一个错误,我正在使用v3.6,但我不知道它是否已被修复。当提示添加到CuePointManager时,它会根据提示的时间进行插入排序。但是,在算法的某一点上,它将数字舍入为:

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

然后,它会检查比较方法返回的索引(它表示应该插入cue),而不使用舍入:

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

我的3.3 cue触发5.6000000000000005由于浮点错误而具有该值 - 我添加了0.2到5.4。因此,当 getCuePointIndex 返回正确的索引时,它会在第二行上设置为 0 ,将其放在列表中的第一位。

我的解决方法是在添加之前简单地对提示进行四舍五入:

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”部分,因为我遇到了两个具有相同名称的提示的问题)

希望这有助于某人!