所以..我有一个 带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);
}
我不认为有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类。
以下为我工作:
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,就像我在这里所做的那样。