2011-03-26 22 views

Respuesta

10
var sound:Sound = whateverSoundYouNeedToPlay; 
function playSound():void 
{ 
    var channel:SoundChannel = sound.play(); 
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete); 
} 

function onComplete(event:Event):void 
{ 
    SoundChannel(event.target).removeEventListener(event.type, onComplete); 
    playSound(); 
} 
27

Esto no le proporcionará una reproducción perfecta y sin interrupciones, pero hará que el sonido emita un bucle.

var sound:Sound = new Sound(); 
var soundChannel:SoundChannel; 

sound.addEventListener(Event.COMPLETE, onSoundLoadComplete); 

sound.load("yourmp3.mp3"); 


// we wait until the sound finishes loading and then play it, storing the 
// soundchannel so that we can hear when it "completes". 
function onSoundLoadComplete(e:Event):void{ 
    sound.removeEventListener(Event.COMPLETE, onSoundLoadComplete); 
    soundChannel = sound.play(); 
    soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete); 
} 

// this is called when the sound channel completes. 
function onSoundChannelSoundComplete(e:Event):void{ 
    e.currentTarget.removeEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete); 
    soundChannel = sound.play(); 
} 

Si desea que el sonido de bucle muchas veces con una reproducción impecable, sin espacios en blanco, puede llamar

sound.play(0, 9999); // 9999 means to loop 9999 times 

Pero todavía tendría que definir un detector soundComplete si quieres infinita reproducción después de la 9999.a jugada. El problema con esta forma de hacer las cosas es si tiene que pausar/reiniciar el sonido. Esto creará un canal de sonido cuya duración es 9999 veces más larga que la duración real del archivo de sonido, y la reproducción de llamada (duración) cuando la duración es más larga que la duración del sonido provoca un bloqueo horrible.

+2

+1. El uso del parámetro de bucle es más simple y le ofrece mejores resultados como usted menciona. Si lo configuras en un número lo suficientemente grande, no es necesario que te preocupes por 'SOUND_COMPLETE'. Siendo un 'int', supongo que podría establecerlo en un valor máximo de 0x7fffffff ((2^31) - 1), que, para todos los propósitos prácticos, debería ser más que suficiente. –

+0

"Mejor" es subjetivo en este caso. Mejor fidelidad de sonido, seguro, pero un dolor mucho más grande para trabajar si el sonido debe pausarse/reanudarse por cualquier motivo. – scriptocalypse

+0

Bastante justo. Quise decir mejor en el sentido de reproducción sin espacios. –

0

Las otras respuestas son geniales; sin embargo, si no desea utilizar el código (por el motivo que sea), puede poner el sonido en un clip de película, establecer la propiedad del sonido en "Transmisión" y luego agregar tantos marcos como le gusta el clip de película para asegurarse de que se reproduce completamente.

Esto, por supuesto, es una forma menos preferida, pero para los animadores estoy seguro de que puede ser preferible en algunas situaciones (por ejemplo, cuando se sincroniza con animaciones de la boca que el animador quiere en bucle).

3

Para ampliar reproducción sin interrupciones @ de scriptocalypse un poco:

El problema de no tener reproducción sin interrupciones adecuada proviene de mp3 incluyendo información sobre el archivo, ya sea en la cabeza o la cola del archivo (etiquetas ID3, etc.), de ahí la pequeña pausa cuando tratas de recorrerlo. Hay algunas cosas que puede hacer dependiendo de su situación.

  1. Ignorelo, solo juegue normalmente, con una pequeña pausa al final de cada archivo. También puede tratar de enmascararlo con otro sonido (un beat drop yo), o fade out y fade in.
  2. Si sus sonidos están incrustados, y no transmiten, cree un archivo fla, arrastre su mp3 allí, y configúrelos para exportar (de la misma manera que agregaría un nombre de enlace para un MovieClip, etc.). Parece que cuando exporta sonidos como este, Flash tiene en cuenta la demora o la elimina cuando crea el objeto Sound. De cualquier forma, puedes hacer un simple play() pasando los loops que deseas para una reproducción sin espacios (he encontrado que usar un parámetro loops es mejor que esperar en el evento SOUND_COMPLETE y reproducirlo de nuevo).
  3. Puede probar algunas de las bibliotecas ogg para usar archivos .ogg en lugar de .mp3. Una simple búsqueda en google para "as3 ogg lib" le mostrará lo que necesita. Personalmente, me pareció un poco incómodo de usar, y no podía permitirme la sobrecarga añadida (a diferencia de la decodificación de mp3, que se realiza en el reproductor).
  4. Si sus archivos mp3 se están transmitiendo, la única forma de obtener una reproducción sin interrupciones es aplicarles capas. Determine el espacio (dependiendo de lo que utilizó para codificarlos, será diferente - mis archivos tienen un espacio de 330ms), y cuando lo alcanza, comience a reproducir la superposición. Es un dolor adecuado si te estás desvaneciendo, pero cuando funciona, funciona bastante bien. Peor de los casos, se termina con la situación (1)
4
import flash.media.Sound; 
import flash.media.SoundChannel; 

var mySound:Sound = new Bgm(); //Bgm() is the class of the internal sound which can be done in the library panel. 

playSound(); 

function playSound():void 
{ 
    var channel:SoundChannel = mySound.play(); 
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete); 
} 

function onComplete(event:Event):void 
{ 
    SoundChannel(event.target).removeEventListener(event.type, onComplete); 
    playSound(); 
} 

Esto funciona perfectamente.

+0

No sé perfectamente, necesitas importar 'flash.events.Event'. Además, más importante aún, después del primer ciclo, parece que no puedo detener la música; Quiero detener la música y jugar un juego sobre el sonido. – audiFanatic

2

supongo que esto lo que busca en el caso de que el archivo de voz/música está en la biblioteca:

var mysound:my_sound = new my_sound(); 
mysound.play(0,2); // this will repeat the sound 2 times. 
1

Esto parece haber funcionado para mí:

var nowTime:Number = (new Date()).time; 
var timeElapsed:Number = nowTime - _lastTime; 

_lastTime = nowTime; 
_musicTimeElapsed+=timeElapsed; 

if(_musicTimeElapsed >= _musicA.length - GAP_LENGTH) 
{ 
    _musicTimeElapsed = 0; 
    _musicA.play(0); 
} 
Cuestiones relacionadas