2009-10-25 53 views
11

所以..我有一個緩衝區與MP3數據(如果我將保存此緩衝區,並將其稱爲buffer.mp3它會播放,但在這種情況下,我不應該將其保存到文件系統)。 我必須玩,但我不能,我該怎麼辦?如何在ActionScript 3中從緩衝區(ByteArray/Stream)播放MP3聲音?


我試了下代碼播放buffrer(字節陣列\流)(我從服務器獲取MP3數據獲取數據的方法,工作正常(上測試文本廉政局等)我叫回來的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); 
     } 
+0

此線程可能會有所幫助http://stackoverflow.com/questions/1553563/play-flv-from-bytearray-in-flash-player – Amarghosh 2009-10-26 04:34:04

回答

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,正如我在這裏所做的那樣。

+0

as @ user238621 said this only only a bunch of random distortion sound – 2011-03-13 19:50:17

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類。

相關問題