2009-10-25 6 views
11

Así que ... Tengo un buffer con datos MP3 (Si quisiera guardar este buffer 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?¿Cómo reproducir el sonido MP3 desde el búfer (ByteArray/Stream) en ActionScript 3?


He probado el siguiente código para jugar ese buffrer (ByteArray \ Stream) (me da datos MP3 desde un servidor el método de obtención de datos funciona bien (probado en el texto de int etc) que llamo el vuelto ByteArray readResponse porque Tengo algún método de conexió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); 
     } 
+0

Este tema puede ser útil http://stackoverflow.com/questions/1553563/play-flv-from-bytearray-in-flash-player – Amarghosh

Respuesta

2

Los siguientes obras 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 necesite para comprobar lo que está almacenado en su readResponse ByteArray o cómo los datos se lee en conseguir cuando estás de cargarlo. Asegurándome de que está cargado el URLLoader usando URLLoaderDataFormat.BINARY o simplemente usando un URLStream como he hecho aquí.

+0

como @ user238621 dijo que esto solo me da un montón de sonidos distorsionados al azar –

4

No creo que hay una solución a mp3 datos binarios, pero si es un wav, entonces esto 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; 
    } 

no olvide quitar encabezado WAV, antes de probar los datos embargo. Además, solo funciona bien cuando la frecuencia de muestreo es 44.1kHz. Para otras frecuencias de muestreo, necesita repetir o eliminar muestras manualmente para que sean similares a 44.1kHz. Preste atención a los sonidos mono, ya que debe suministrar ambas muestras de canal derecho & a Flash, por lo tanto, debe repetir las muestras.

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

Cuestiones relacionadas