Я хотел показать спектр звука, поэтому я написал код, который извлекает небольшое количество данных каждые 5 мс звука и вычисляет его амплитуду. Однако это не сработало!
Итак, я написал небольшой код для проверки своего кода:
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
))
При тестировании с mp3-файлом 6,82 МБ 256 Кбит / с, когда 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...
) Как мне изменить этот код, чтобы он работал так, как я ожидал - извлекать необработанные звуковые данные каждые 5 мс?