2008-10-22 20 views
6

Tengo algunos clips de audio muy cortos (menos de un segundo de duración) para reproducir en varios eventos (botón al pasar el ratón, hacer clic, etc.). Sin embargo, generalmente hay un retraso significativo entre la acción y la reproducción real del sonido. Intenté incrustar el sonido en .swf y cargarlo externamente al principio, pero ambos conducen a los mismos resultados. Del mismo modo, lo he intentado con audio comprimido y sin comprimir.Latencia al reproducir sonidos cortos en Flash 9, Actionscript 3

Lo que parece gusta es que los buffers de audio son mucho más tiempo de lo que necesito que sean, como quizá flash se optimiza más hacia la reproducción de sonido largos sin ningún tartamudeo a expensas de un poco más de latencia en partida sonidos. ¿Podría ser esto? ¿Hay alguna forma de cambiarlos? Ya que lo que estoy trabajando nunca necesitará reproducir sonidos de más de un segundo o tanto y siempre estará cargado por completo desde el principio, no me haría daño tener buffers realmente cortos.

Otra posible cosa que podría ser la causa: si uso archivos .wav cuando uso loadSound() ... no puedo escuchar los sonidos. No hay errores, y todo vuelve como debería, pero no se reproduce el sonido real, por lo que los tengo como .mp3 actualmente. Tal vez cuando use audio .mp3 (o cualquier audio comprimido), ¿habrá retraso en la decodificación? Sin embargo, la razón por la que aún tengo dudas sobre esto es que al insertarlos en el .swf como archivos .wav (importándolos en la biblioteca), todavía tienen la misma latencia en la reproducción.

Solo para una verificación de cordura, incluiré el código que tengo, menos las partes irrelevantes y la comprobación de errores. En primer lugar, cargarlos en tiempo de ejecución:

var soundArray:Array = new Array(); 
loadSound("click", "sounds/buttondroop4.mp3"); 
loadSound("hover", "sounds/Dink-Public_D-146.mp3"); 

function loadSound(name:String, url:String):void 
{ 
    var req:URLRequest = new URLRequest(url); 
    soundArray[ name ] = new Sound(req); 
    soundArray[ name ].addEventListener(Event.COMPLETE, soundLoaded); 
} 
function soundLoaded(event:Event):void 
{ 
    for(var name:String in soundArray) 
    { 
     if(event.target == soundArray[name]) 
     { 
     trace("Loaded sound [" + name + "]"); 
     return; 
     } 
    } 
} 
function playSound(name:String):void 
{ 
    for(var nameSrc:String in soundArray) 
    { 
     if(name == nameSrc) 
     { 
     var channel:SoundChannel = soundArray[ name ].play(); 
     return; 
     } 
    } 
} 

// Sometime later, well after soundLoaded() callback is triggered... 
playSound("click"); 
playSound("hover"); 

Y una forma alternativa, incrustarlos en la biblioteca como clases e ir desde allí:

var sClick:soundClick = new soundClick(); 
var sHover:soundHover = new soundHover(); 
sClick.play(); 
sHover.play(); 

Los archivos de sonido son muy pequeñas, de menos de 10 kb general. El desfase es tan evidente que una de las primeras quejas que alguien tuvo al mirarlo fue que los efectos de sonido en los botones suspendidos parecían retrasados, así que no era solo yo el que estaba siendo quisquilloso. Siento que debo estar haciendo algo mal; hay demasiados flashes que tienen efectos de sonido rápidos sin ningún tipo de retraso.

editar: En respuesta a la primera respuesta sobre los archivos de sonido en sí, ya he comprobado, y el sonido comienza inmediatamente al comienzo del archivo (incluso recortando todo menos el primer milisegundo de sonido, todavía puedo escuchar el inicio del ruido 'tic' que hace).

+0

La latencia, o lag, tiene que ver con la forma en que funciona la codificación MP3. Sin embargo, el flash puede evitarlo si incrusta los sonidos como archivos WAV. (Los archivos WAV no se pueden cargar desde una fuente externa.) Si está interesado en obtener más detalles, consulte la Parte 2 aquí: http://www.compuphase.com/mp3/mp3loops.htm –

Respuesta

6

Es una pequeña cosa, pero:

function playSound(name:String):void 
{ 
    for(var nameSrc:String in soundArray) 
    { 
     if(name == nameSrc) 
     { 
     var channel:SoundChannel = soundArray[ name ].play(); 
     return; 
     } 
    } 
} 

debe ser:

function playSound(name:String):void 
{ 
    if(soundArray[name]) 
    { 
     soundArray[name].play(); 
    } 
} 

No hay necesidad de un bucle de mirar hacia arriba ya que eso es lo que la tabla hash es para. Además, no debe usar una matriz para nada, ya que una matriz es un conjunto ordenado que se indexa utilizando enteros. Desea utilizar un objeto (o diccionario) en este caso y asígnele el nombre de matriz de sonido (ya que asigna nombres de sonido a objetos de sonido).

En cuanto a la latencia de sonido, no debería haber ninguna. He hecho bastante sonido en Flash (incluyendo toneladas de rollover y sonidos de lanzamiento) y nunca ha sido un problema. Sin embargo, Flash Player 10 tiene un nuevo low-level sound API que es descrito por uno de los ingenieros de Adobe en ese artículo. Una solución que involucra eso es un poco de martillo, pero quizás esté buscando una precisión de milisegundos.

El consejo que fenomas da es sabio: compruebe el archivo mp3 para espacio muerto al inicio y al final y recorte lo más cerca posible. Además, ¿cuál es el camino desde el controlador de eventos hasta tu declaración de juego? ¿Hay posibles bloques allí? ¿Cuál es el formato del mp3? Flash funciona mejor con codificaciones específicas (44.1 hHz y 128 bit, creo).

4

Bueno, mi primera respuesta es que cuando he hecho cosas como esta, normalmente encuentro que los archivos de sonido tienen una cierta cantidad de tiempo de espera incorporada. Se podía verificar en un editor de sonido, pero lo que yo ' Lo que hice en el pasado es importar el sonido en Flash IDE, hacer un clip de película vacío y poner el sonido en el cuadro 1 del clip. Luego, pero editando el sonido del cuadro, obtienes una pequeña interfaz para arrastrar los puntos de inicio/final de la reproducción de sonido. Luego solía adjuntar/quitar el clip para reproducir el sonido, o dejarlo en algún lado y usar comandos de cuadro.

Si ya está seguro de que el tiempo de entrega está en flash y no en el audio, entonces no tengo consejos ni trucos, más allá de cosas razonablemente obvias como tocar los sonidos al hacer clic en la tecla en vez de hacia arriba ...

4

I tenía exactamente el mismo problema ... hasta que noté que el problema solo estaba ocurriendo solo durante la vista previa en Flash. Intenta ejecutar el archivo SWF compilado (funcionó para mí).

1

Tuve una mala sonoridad de sonido (aproximadamente 1 segundo completo) con Flash Player 10.0.2.x. La latencia fue la misma al detener el canal de sonido.

Acabo de actualizar a 10.0.22.x y el problema se ha ido.

3

Estoy teniendo el mismo problema. Encontré esto Aparentemente, si mantiene el reproductor de sonido "en marcha" silenciosamente en segundo plano, no necesita "reiniciar" para pequeños sonidos. no han probado todavía ...

http://www.ghostwire.com/blog/archives/as3-fixing-the-lag-that-arises-when-playing-a-short-sound-effect/

+0

Esto funcionó para mí - Necesitaba un ambiente de todos modos, así que maté 2 pájaros con 1 piedra. –

+0

Editar: Bueno, pensé que esto funcionó para mí, pero tal vez no ... Sin duda parece el tipo de cosa que DEBERÍA funcionar. –

2

Una solución podría ser el uso de una biblioteca de ActionScript que lee archivos de sonido como datos binarios.

StandingWave
https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/

Además, asegúrese de comprobar la configuración de audio del entorno alrededor de su SWF. Estaba depurando mi aplicación durante horas hasta darme cuenta de que la latencia venía de mi conexión de auriculares bluetooth.

Cuestiones relacionadas