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

StackOverflow https://stackoverflow.com/questions/1619773

Вопрос

Итак ... У меня есть буфер с данными 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);  
        }
Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top