我想显示声音的频谱,所以我编写了一个代码,每5ms声音提取少量数据,然后计算它的振幅。但是,它没有用!
所以,我写了一个小代码来测试我的代码:
import flash.events.*;
import flash.media.*;
import flash.net.*;
import flash.utils.*;
stop();
var musicURL:String = "<<MP3 SOUND FILE URL>>";
var music:Sound = new Sound();
var delt:int = 5;
function exSpec(){
var t:Number=0,bArray:ByteArray = new ByteArray();
for(var i:int=0;i<500;i++){
bArray.clear();
music.extract(bArray,16,int(t*44.1));
t+=delt;
bArray.position = 0;
var amp:Number = 0;
for(var j:int=0;j<16;j++){
//bArray.readFloat(); - to read only one channel
amp+=Math.abs(bArray.readFloat());
}
trace(t,amp);
}
}
music.addEventListener(ProgressEvent.PROGRESS,function(pe:ProgressEvent){
if(pe.bytesLoaded/pe.bytesTotal==1) exSpec();
});
music.load(new URLRequest(musicURL));
注意:由于music.play()
能很好地播放音乐,因此musicURL
绝对没有错误。 (PS:音乐文件保存在我的电脑上(D:\blahblah
))
当我使用6.82MB 256kbps mp3文件进行测试时,当delt
= 5时,此代码打印
5 0
10 0
15 0
... (all amps are zero)
195 0
200 0
205 0
... (all amps are zero)
2490 0
2495 0
2500 0
但是,如果delt
= 50,则此代码打印
50 0
100 0
150 4.40509033203125
200 3.437042236328125
... (some random values)
我的预期。
为什么这些结果不同? (当t
= 200时,第一个打印0
,第二个打印3.437...
)如何更改此代码以按预期工作 - 每5ms提取原始声音数据?