Domanda

Prima di iniziare a riprodurre il film, aggiungo un paio di punti di spunta, quindi registro il callback e traccia ogni volta che viene colpito, in questo modo:

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

Lo penseresti CuepointObject.time sarebbe approssimativamente uguale al film Playheadtime. Ecco l'output:

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

Sembra che aspetti fino a quando non viene attivato "cue3.4" e quindi il resto seguono per qualche motivo. Vengono aggiunti al video come un array, che è ordinato nell'ordine in cui dovrebbero apparire, approssimativamente, quindi cue3.4 non è per primo.

È stato utile?

Soluzione

Ho trovato il problema dopo il debug per un po ', quindi sto pubblicando la soluzione qui nel caso in cui qualcun altro lo inciampa.

È un bug in Flex, sto usando V3.6 ma non so se è stato risolto. Quando i segnali vengono aggiunti al CuepointManager, fa un tipo di inserimento basato sul tempo del segnale. Tuttavia, ad un certo punto dell'algoritmo arrotonda il numero in questo modo:

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

E poi più tardi, controlla l'indice che il metodo di confronto restituisce (dove dice che l'indicazione dovrebbe essere inserito) senza usare l'arrotondamento:

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

Il mio 3,3 segnali che innesca a 5.6000000000000005 ha quel valore a causa di un errore di punto galleggiante - ho aggiunto da 0,2 a 5,4. Allora mentre getCuePointIndex restituisce il diritto indice, quindi viene impostato su 0 Su quella seconda riga, metterlo al primo posto nell'elenco.

La mia correzione è semplicemente fare il round sui tempi dei segnali prima di aggiungerli:

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

(Nota: da allora ho aggiunto le parti "_start" e "_stop" da quando ho avuto un problema con due segnali con lo stesso nome)

Spero che questo aiuti qualcuno!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top