Los primeros puntos de señalización de películas de ActionScript se disparan demasiado tarde

StackOverflow https://stackoverflow.com/questions/4884451

  •  28-10-2019
  •  | 
  •  

Pregunta

Antes de comenzar a tocar la película, agrego un par de puntos de referencia, luego registro la devolución de llamada y trazo cada vez que se golpea, así:

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

Pensarías que cuePointObject.time sería más o menos igual a la película Playheadtime. Aquí está la salida:

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

Parece que espera hasta que se active "Cue3.4" y luego el resto sigue por alguna razón. Se agregan al video como una matriz, que se clasifica en el orden en que deben aparecer, aproximadamente, por lo que Cue3.4 no es primero.

¿Fue útil?

Solución

Encontré el problema después de la depuración por un tiempo, así que estoy publicando la solución aquí en caso de que alguien más se tope con él.

Es un error en Flex, estoy usando v3.6, pero no sé si se ha solucionado. Cuando las señales se agregan al CuePointManager, hace un tipo de inserción basado en el tiempo de la señal. Sin embargo, en un punto en el algoritmo redondea el número como este:

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

Y luego, verifica el índice que devuelve el método de comparación (donde dice que la señal debe insertarse) sin usar redondeo:

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

Mi señal 3.3 que se desencadena a 5.600000000000000005 tiene ese valor debido a un error de punto flotante: he agregado 0.2 a 5.4. Entonces mientras getCuePointIndex Devuelve el derecho índice, luego se establece en 0 En esa segunda línea, ponlo primero en la lista.

Mi solución es simplemente hacer el redondeo en las señales de las veces antes de agregarlas:

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: desde entonces he agregado las partes "_start" y "_stop" ya que tuve un problema con tener dos señales con el mismo nombre)

¡Espero que esto ayude a alguien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top