2009-10-25 16 views
11

Vì vậy .. Tôi có một bộ đệm với dữ liệu MP3 (Nếu tôi lưu bộ đệm này và gọi nó là buffer.mp3 nó sẽ phát, nhưng trong trường hợp này tôi không nên lưu nó vào hệ thống tệp). Tôi phải chơi nó, nhưng tôi không thể, tôi phải làm gì?Làm thế nào để phát âm thanh MP3 từ bộ đệm (ByteArray/Stream) trong ActionScript 3?


Tôi đã thử đoạn code sau để chơi mà buffrer (ByteArray \ Stream) (tôi nhận được dữ liệu MP3 từ máy chủ các phương pháp lấy dữ liệu hoạt động tốt (thử nghiệm trên văn bản int của vv) tôi gọi là trở ByteArray readResponse vì Tôi có một số phương pháp seading và nó là phản ứng của nó).

  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

Chuỗi này có thể hữu ích http://stackoverflow.com/questions/1553563/play-flv-from-bytearray-in-flash-player – Amarghosh

Trả lời

2

Các công trình sau đây cho tôi:

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

Bạn có thể cần phải kiểm tra những gì được lưu trữ trong readResponse ByteArray của bạn hoặc làm thế nào dữ liệu được việc đọc trong khi bạn đang tải nó. Đảm bảo rằng nó được tải URLLoader bằng cách sử dụng URLLoaderDataFormat.BINARY hoặc chỉ bằng cách sử dụng một URLStream như tôi đã làm ở đây.

+0

như @ user238621 cho biết điều này chỉ mang lại cho tôi một loạt các âm thanh bị bóp méo ngẫu nhiên –

4

Tôi không nghĩ rằng có một giải pháp sang MP3 dữ liệu nhị phân, nhưng nếu đó là một wav một, sau đó điều này sẽ làm việc:


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

Hãy nhớ để loại bỏ tiêu đề wav trước khi lấy mẫu dữ liệu mặc dù. Ngoài ra, nó chỉ hoạt động tốt khi tỷ lệ mẫu là 44.1kHz. Đối với các tỷ lệ mẫu khác, bạn cần phải lặp lại hoặc xóa mẫu theo cách thủ công để làm cho mẫu giống như kiểu 44,1kHz. Hãy chú ý đến âm thanh đơn âm, vì bạn cần cung cấp cả hai mẫu kênh bên phải & bên phải cho Flash, do đó cần phải lặp lại các mẫu.

Điểm khởi đầu tốt là lớp WavDecoder bên trong gói audio.format.wav của Popforge.