【问题标题】:Early ActionScript movie cue points trigger too late早期的 ActionScript 电影提示点触发太晚
【发布时间】:2011-06-20 13:05:08
【问题描述】:

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

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

【问题讨论】:

  • actionscript 提示点并不总是可靠的。如果您可以使用嵌入式提示点,那就太好了。如果您使用的是动作脚本提示点并且它们不适合您,也许您可​​以使用 Timer 类(多个实例或单个实例,您将使用时间值数组中的提示之间的相对时间进行更新)
  • “可靠”是什么意思?我知道它们可以在 +/- 0.1 秒左右的时间内触发,但对于这个用例来说这对我来说很好。嵌入式提示点不是一个选项,因为我正在做一个注释 UI,在视频已经编码后必须使用它。

标签: actionscript-3 flex3 cue-points


【解决方案1】:

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

这是 Flex 中的一个错误,我使用的是 v3.6,但我不知道它是否已修复。当 cue 添加到 CuePointManager 时,它会根据 cue 的时间进行插入排序。然而,在算法的某一时刻,它会像这样对数字进行四舍五入:

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;

由于浮点错误,我在 5.6000000000000005 触发的 3.3 提示具有该值 - 我已将 0.2 添加到 5.4。因此,当 getCuePointIndex 返回正确的 index 时,它会在第二行设置为 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”部分,因为我遇到了两个同名提示的问题)

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2011-04-24
    • 2012-04-13
    • 2010-09-23
    相关资源
    最近更新 更多