2009-08-04 11 views
7

Tengo algunos problemas con el bucle de un sonido en flash AS3, ya que cuando digo el sonido en bucle recibo un ligero retraso al final/comienzo del audio.Método preferido para el bucle de sonido flash as3

El audio se recorta correctamente y se reproducirá sin espacio en la banda del garaje.

Sé que hay problemas con el sonido en general de flash, errores con codificaciones y las imprecisiones con el evento SOUND_COMPLETE (y Adobe debería darles vergüenza con su manejo de estos temas)

He tratado de utilizar el construido en el argumento loop en el método play en la clase Sound y también reacciona en el evento SOUND_COMPLETE, pero ambos causan un retraso.

Pero, ¿alguien ha ideado una técnica para reproducir un sonido sin ningún espacio visible?

+0

Hey, Brian, ver usted ha aceptado la respuesta de Branden, pero ¿podría decirme si la solución de Mercer funcionó? ¿Lo intentaste? Prefiero no recurrir al uso del evento SAMPLE_DATA si puedo ayudarlo ... – aaaidan

+0

Hmm, puedo responder mi pregunta: no. La ejecución de llamadas en un controlador de eventos Event.SOUND_COMPLETE no elimina la brecha, al menos en os x, FP10. – aaaidan

+0

En realidad, el método Event.SOUND_COMPLETE eventualmente puede funcionar. El archivo que estaba usando tenía pequeños espacios al principio y al final. – aaaidan

Respuesta

7

El método más confiable, si puede usar Flash Player 10, es utilizar el nuevo evento SampleDataEvent.SAMPLE_DATA.

Específicamente, lo primero que debe hacer es crear una instancia del sonido que desea, luego use el nuevo método de extracción para convertir el sonido en datos PCM sin procesar codificados en un ByteArray. Luego puede crear un nuevo objeto Sound y configurarlo para escuchar su evento SampleDataEvent.SAMPLE_DATA. Cuando se llame a ese evento, presionará 2-8k (una cantidad menor reduce la latencia, pero aumenta la posibilidad de artefactos audibles) de los datos del ByteArray. Solo asegúrate de que, al salir del ByteArray, vuelves al principio.

Este método garantiza que tendrá una reproducción completamente sin interrupciones.

+1

Esta es una característica interesante y ha hecho posible algunas cosas increíbles (como Hobnox), pero es una pena que uno deba recurrir a la manipulación de bytes de bajo nivel solo para reproducir un bucle de sonido sin problemas. El soporte de audio en el reproductor y el API de sonido son muy populares. –

+1

Es una lástima, pero todos estos problemas radican en el hecho de que el motor de sonido de Flash Player es realmente viejo, y simplemente necesita una actualización, que debería venir en el reproductor 11. –

+0

Ciertamente es más complicado que llamar a play() :) Pero suena como una solución determinista. Lo intentaré con Brandon y te responderé. –

1

Así es como lo hizo id, sin demoras notables. aplicación principal: Clase

package { 

import flash.display.MovieClip; 
import flash.events.*; 
import flash.utils.*; 

public class MainApp extends MovieClip { 
    private var player:Player; 
    .......... 

    public function MainApp() { 
     ....... 
     player = new Player(); 
     player.addEventListener(Player.EVENT_SOUND_COMPLETED, handleSoundCompleted); 
     ...... 
    } 

    private function handleSoundCompleted(event:Event):void { 
     player.setPosition(0); 
     player.play(); 
    } 

    ................. 

jugador:

package { 

import flash.events.*; 
import flash.media.*; 
import flash.net.*; 

public class Player extends EventDispatcher { 

    private var sound:Sound; 
    private var channel:SoundChannel; 
    private var position:Number; 

    static const SOUND_VOLUME:Number = 0.75; 
    static const EVENT_SOUND_COMPLETED:String = "SOUND_COMPLETED"; 

    public function Player() { 

     // init 
     sound = new ThemeSong(); 
     position = 0; 

     // listeners 
     sound.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event){trace(event)}); 

     trace("Player initialized..."); 
    } 

    public function play():void { 
     channel = sound.play(position); 
     channel.soundTransform = new SoundTransform(SOUND_VOLUME); 
     channel.addEventListener(Event.SOUND_COMPLETE, function(event:Event){dispatchEvent(new Event(EVENT_SOUND_COMPLETED));}); 
     trace("Player playing.."); 
    } 

    public function pause():void { 
     if (channel != null) { 
      channel.stop(); 
      position = channel.position; 
     } 
     trace("Player paused.."); 
    } 

    public function setPosition(pos:Number):void { 
     position = pos; 
    } 

    public function getPosition():Number { 
     if (channel == null) { 
      return 0; 
     } else { 
      return channel.position; 
     } 
    } 
} 
} 

Dijiste que el archivo MP3 tiene ningún retraso en el inicio/final, pero sugiero abrirla con audacity, y asegurarse de que no hay ningún retraso .

+0

Hola, Mercer, este es esencialmente el enfoque que he estado usando, espero que no vuelva a colocar el audio cada vez que se complete el sonido. Lo probaré y veré cómo funciona. Gracias –

+0

Hola Mercer, lo he intentado hace un momento y la brecha es muy notable para reproducir música. Gracias por compartir tu código, ¡aunque! – aaaidan

+0

Oh, en realidad, invierte eso. Puede ser que este método funcione. El sonido que estaba usando tenía pequeños huecos al principio y al final. Cheers – aaaidan

3

De acuerdo con this guy, tiene que importar el bucle de música como un wav, y tener el propio Flash IDE comprimido a mp3. Tener Flash utiliza datos importados de mp3 significa que no sabrá cómo hacer un bucle de manera adecuada.

5

El bucle sin pausa de mp3 no es trivial debido a la forma en que funciona el formato. Para simplificar un poco; el sonido está ajustado a varios cuadros, este número no se puede elegir arbitrariamente, en cambio se requiere algo de relleno (con silencio). Mp3 no tiene forma de almacenar cuánto relleno se agregó, por lo que esta información se pierde una vez que el archivo está codificado.

El IDE flash se soluciona con la incrustación de estos metadatos, y usted también puede hacerlo. Solo necesita saber cuánto retraso agrega el codificador.

Andre Michelle explains this way better than I can on his blog.

1

puedo utilizar esta gran herramienta: http://www.compuphase.com/mp3/mp3loop.zip

Se le da un archivo WAV y devuelve un archivo MP3 que pueden ser perfectamente juega con Sound 's método estándar play - por ejemplo (y gaplessly!):

var manyLoops:int = 1000*1000; // a Million is a lot :) 
mySound.play(0, manyLoops); 

También puede tomar el archivo de salida de MP3 y volver a convertirlo en un archivo WAV (usando AudioCity por ejemplo) - entonces usted tiene un WAV sin espacios en blanco (que puede trabajar grande dentro de su archivo FLA)

Espero que ayude

+0

puede usar int.MAX_VALUE – mika

0

Quería crear una biblioteca para audio en bucle que no dependiera de eventos COMPLETOS. Decidí crear mi propio standingwave3 addons library. Verifique el original standingwave3 project by MaxL0rd. Extraigo un trabajo en progreso y hace el trabajo, en el nivel de bytes para ese asunto (sin temporizadores de bucle ni nada). Funciona al tomar un sonido con puntos de bucle de inicio y finalización. A continuación, clona la muestra de bucle varias veces en función del tiempo proporcionado en segundos. Debería ser sencillo de usar. Este es el código de la clase Main.as en el archivo "bucle" en la carpeta "ejemplos":

package 
{ 

    // Imports. 
    import com.greensock.events.LoaderEvent; 
    import com.greensock.loading.LoaderMax; 
    import com.greensock.loading.MP3Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import com.greensock.TweenMax; 
    import com.SW3.gadget.LoopGadget; 
    import flash.media.Sound; 


    // Class. 
    public class Main extends Sprite 
    { 

     // Vars. 
     private var loader:LoaderMax;// Using LoaderMax for ease of use. 


     // Constructor. 
     public function Main() 
     { 

      trace("Main"); 

      loader = new LoaderMax({ name:"audio", onComplete:onSoundsLoaded }); 
      loader.append(new MP3Loader("assets/Beat.mp3", { autoPlay:false })); 
      loader.append(new MP3Loader("assets/Clap.mp3", { autoPlay:false })); 
      loader.append(new MP3Loader("assets/Boom.mp3", { autoPlay:false })); 
      loader.load(); 

     } 


     private function onSoundsLoaded(e:LoaderEvent):void 
     { 

      trace("onSoundsLoaded"); 
      var looping:LoopGadget = new LoopGadget; 
      looping.addLoopSound("Beat", e.currentTarget.content[ 0 ] as Sound, 0, 10); 
      looping.addLoopSound("Clap", e.currentTarget.content[ 1 ] as Sound, 0, 10); 
      //looping.addLoopSound("Boom", e.currentTarget.content[ 2 ] as Sound, 0, 10); // Commented out to test possible error. 

      looping.playLoop("Beat");// Play the "Beat" loop. 
      looping.playLoop("Clap");// Play the "Clap" loop. 
      looping.stopLoop("Beat");// Stop the "Beat" loop. 
      looping.playLoop("Beat");// Play the "Beat" loop. 
      looping.playLoop("Beat");// Play the "Beat" loop again to test if it would error out.. 

      looping.stopAllLoops();// Stop all the loops. 
      looping.playLoops([ "Beat", "Clap", "Boom" ]);// Play all the loops. Test to see if "Boom" will error out. 

     } 

    } 

} 

Salida los archivos de origen más aquí: https://github.com/charlesclements/standingwave3-addons

Cuestiones relacionadas