如何在ActionScript 3中从缓冲区(ByteArray / Stream)播放MP3声音?

时间:2009-10-25 02:20:06

标签: actionscript-3 mp3 stream bytearray buffer

所以......我有一个带有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);  
        }

3 个答案:

答案 0 :(得分:4)

这个不起作用,因为SampleDataEvent.data需要未压缩的原始样本数据,而不是MP3。请改用http://wiki.github.com/claus/as3swf/play-mp3-directly-from-bytearray

答案 1 :(得分:4)

我认为没有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.1kHz时才能正常工作。对于其他采样率,您需要手动重复或删除样本,使其像44.1kHz一样。请注意单声道声音,因为您需要提供左声道和左声道。右声道采样到Flash,因此需要重复采样。

良好的起点是Popforge的audio.format.wav包中的WavDecoder类。

答案 2 :(得分:2)

以下适用于我:

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中存储的内容,或者在加载数据时如何读取数据。确保它使用URLLoaderDataFormat.BINARY加载了URLLoader,或者只是使用了URLStream,就像我在这里一样。