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).
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 –