所以......我有一个带有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);
}
答案 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,就像我在这里一样。