每5毫秒提取原始声音数据

时间:2011-06-24 14:26:46

标签: actionscript-3 audio flash-cs5

我想显示声音的频谱,所以我编写了一个代码,每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提取原始声音数据?

0 个答案:

没有答案