Как воспроизвести звук MP3 из буфера (ByteArray / Stream) в ActionScript 3? - PullRequest
11 голосов
/ 25 октября 2009

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


Я попробовал следующий код для воспроизведения этого буфера (ByteArray \ Stream) (я получаю данные MP3 с сервера, метод получения данных работает нормально (проверено на text 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);  
        }

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Это не работает, так как SampleDataEvent.data ожидает несжатых необработанных данных образца, а не MP3. Вместо этого используйте http://wiki.github.com/claus/as3swf/play-mp3-directly-from-bytearray.

4 голосов
/ 18 марта 2011

Я не думаю, что есть решение для двоичных данных в формате 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.

2 голосов
/ 27 октября 2009

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

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, как я сделал здесь.

...