0

ムービーの再生を開始する前に、いくつかのキュー ポイントを追加し、コールバックを登録して、ヒットするたびにトレースします。次のようにします。

    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 が最初ではありません。

4

1 に答える 1

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;

5.6000000000000005 でトリガーする私の 3.3 キューは、浮動小数点エラーのためにその値を持っています - 私は 0.2 を 5.4 に追加しました。したがって、getCuePointIndexは正しいindexを返しますが、その 2 行目で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"});

(注:同じ名前のキューが2つあるという問題があったため、「_start」と「_stop」の部分を追加しました)

これが誰かを助けることを願っています!

于 2011-02-03T09:50:59.567 に答える