Извлекать необработанные звуковые данные каждые 5 мс - PullRequest
0 голосов
/ 24 июня 2011

Я хотел показать спектр звука, поэтому я написал код, который извлекает небольшое количество данных каждые 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 мс?

...