Как воспроизвести звук MP3 из буфера (ByteArray/Stream) в ActionScript 3?

Итак, у меня есть буфер с данными MP3 (если бы я сохранил этот буфер и назову его buffer.mp3, он бы играл, но в этой ситуации я не должен сохранять его в файловой системе), Мне нужно играть, но я не могу, что мне делать?


Я попробовал следующий код для воспроизведения этого буфера (ByteArray\Stream) (я получаю данные MP3 с сервера, метод получения данных работает нормально (проверен на текст int и т.д.) Я вызываю возвращаемый ByteArray readResponse, потому что у меня есть метод seading и это ответ).

            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);  
        }

Ответ 2

Я не думаю, что есть решение для двоичных данных mp3, но если это wav-одно, тогда это должно работать:


   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;
  }

Не забудьте удалить заголовок wav перед данными выборки. Кроме того, он работает только при частоте дискретизации 44,1 кГц. Для других скоростей выборки вам необходимо вручную повторить или удалить образцы, чтобы сделать его равным 44,1 кГц. Обратите внимание на монофонические звуки, так как вам нужно снабдить образцы левого и правого каналов Flash, поэтому вам нужно повторить образцы.

Хорошей отправной точкой является класс WavDecoder внутри пакета Popforge audio.format.wav.

Ответ 3

Для меня работает следующее:

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);
  }
 }
}

Вам может потребоваться проверить, что хранится в вашем файле ReadResponse ByteArray, или как данные считываются при загрузке. Убедившись, что он загрузил URLLoader с помощью URLLoaderDataFormat.BINARY или просто с помощью URLStream, как я здесь сделал.