Pregunta

Entonces ... tengo un búfer con datos MP3 (si quisiera guardar este búfer y llamarlo buffer.mp3, se reproducirá, pero en esta situación no debería guardarlo en el sistema de archivos) . Tengo que jugarlo, pero no puedo, ¿qué debo hacer?


Intenté el siguiente código para reproducir ese buffrer (ByteArray \ Stream) (Obtengo datos MP3 del servidor. El método para obtener datos funciona bien (probado en el texto int, etc.) Llamo a la respuesta ByteArray readResponse porque tengo algún método de impresión. y es su respuesta).

            protected function Play(event:MouseEvent):void
        {
            var mySound:Sound = new Sound();
            mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, soundFill);
            mySound.play(); 
        }

        public function soundFill(event:SampleDataEvent):void
        {
            event.data.writeBytes(readResponse.buffer, 0, readResponse.buffer.length);  
        }
¿Fue útil?

Solución

Este no funciona, ya que SampleDataEvent.data espera datos de muestra sin comprimir, no MP3. Utilice http://wiki.github.com/claus/as3swf / play-mp3-direct-from-bytearray en su lugar.

Otros consejos

No creo que haya una solución para los datos binarios de mp3, pero si es una wav, entonces debería funcionar:


   private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0);
   /**
    * Remove wav header here
    */
   bArr.position = 0;
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   var bytesToRead:int = (bArr.bytesAvailable > 65536 ? 65536 : bArr.bytesAvailable);
   event.data.writeBytes(bArr, bArr.position, bytesToRead);
   bArr.position += bytesToRead;
  }

Sin embargo, recuerde eliminar el encabezado wav antes de muestrear datos. Además, solo funciona bien cuando la frecuencia de muestreo es 44.1kHz. Para otras frecuencias de muestreo, debe repetir o eliminar manualmente las muestras para que sean 44.1 kHz. Preste atención a los sonidos mono, ya que necesita suministrar tanto amp; & amp; Muestras del canal correcto a Flash, por lo que es necesario repetir las muestras.

Un buen punto de partida es la clase WavDecoder dentro del paquete audio.format.wav de Popforge.

Lo siguiente funciona para mí:

package
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.SampleDataEvent;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.net.URLRequest;
 import flash.net.URLStream;
 import flash.utils.ByteArray;

 public class QuickSoundTest extends Sprite
 {
  public var sampleMP3:Sound;
  private var soundChannel:SoundChannel; 
  public var bArr:ByteArray;

  public function QuickSoundTest()
  {
   sampleMP3 = new Sound();

   var urlReq:URLRequest = new URLRequest("test.mp3");
   var urlStream:URLStream = new URLStream();
   urlStream.addEventListener(Event.COMPLETE, loaded);
   urlStream.load(urlReq);

  }

  private function loaded(event:Event):void {
   var urlStream:URLStream = event.target as URLStream;
   bArr = new ByteArray();
   urlStream.readBytes(bArr, 0, 40960);
   sampleMP3.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleDataHandler);
   soundChannel = sampleMP3.play();
  }

  private function sampleDataHandler(event:SampleDataEvent):void {
   event.data.writeBytes(bArr, 0, 40960);
  }
 }
}

Es posible que deba verificar lo que está almacenado en su ReadResponse ByteArray o cómo se leen los datos cuando los está cargando. Asegurándome de que haya cargado el URLLoader usando URLLoaderDataFormat.BINARY o simplemente usando un URLStream como lo he hecho aquí.

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