Ранние метки в ActionScript запускаются слишком поздно - PullRequest
0 голосов
/ 03 февраля 2011

Прежде чем начать воспроизведение фильма, я добавляю пару ключевых точек, затем регистрирую обратный вызов и отслеживаю каждый раз, когда он получает удар, например:

    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 голосов
/ 03 февраля 2011

Я обнаружил проблему после некоторой отладки, поэтому выкладываю решение здесь на тот случай, если кто-нибудь еще наткнется на него.

Это ошибка во 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 возвращает правильное значение 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", поскольку у меня возникла проблема с наличием двух сигналов с одинаковым именем)

Надеюсь, это кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...