使用声音对象.extract()方法,可以将未压缩的声音数据检索为ByteArray。提取的声音数据的格式是什么?自定义内部格式,或建立格式? Endian类型?
我希望能够将sounddata直接加载到byteArray中并从此数据中提供声音播放(绕过下面的步骤1)。
到目前为止,这是我的实验:
步骤1.在这里我加载声音,提取数据内容并将其保存到光盘:
private var sound:Sound;
private var byteArray:ByteArray;
// loading a sound...
private function init():void {
sound = new Sound();
sound.addEventListener(Event.COMPLETE, onComplete);
sound.load(new URLRequest('short.mp3'));
}
// saving it to disc...
private function onComplete(e:Event):void {
byteArray = new ByteArray();
sound.extract(byteArray, 100000000);
byteArray.position = 0;
var file:FileReference = new FileReference();
file.save(byteArray, 'short.data');
}
步骤2.在这里,我从光盘加载数据并使用以下数据提供新声音对象的播放:
private var sound:Sound;
private var byteArray:ByteArray;
// loading a sound...
private function init():void {
file = new FileReference();
file.addEventListener(Event.COMPLETE, onLoaded);
file.addEventListener(Event.SELECT, onSelected);
file.browse();
}
private function onSelected(e:Event):void {
file.load();
}
private function onLoaded(e:Event):void {
trace('loaded');
trace(file.data.length);
byteArray = file.data;
sound2 = new Sound();
sound2.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
sound2.play();
}
private function onSampleData(e:SampleDataEvent):void {
trace(e.position);
for (var i:int = 0; i < 2048; i++) {
var left:Number = byteArray.readFloat();
var right:Number = byteArray.readFloat();
e.data.writeFloat(left * 0.2);
e.data.writeFloat(right * 0.2);
}
}
我希望能够通过使用外部转换器实用程序(sox或其他东西)完成第二步(从光盘加载数据并提供声音对象播放)。
/ Jonas
答案 0 :(得分:1)
它应该是标准的32位浮点数,每个样本每个通道一个。所以我会尝试使用sox的浮点数,但我没有尝试,但我会以一定程度的自信来做... :)浮点数是字节序独立的,我相信......