Пытаюсь получить форму волны для mp3 (в примере только для левого канала), очень удивился, когда обнаружил, что методы sound.extract() и computeSpectrum() возвращают разные значения.
Подскажите в чем проблема? Или, быть может так быть и должно?
Функция onEnterFrame запускается по таймеру каждые 0.5 сек.
Код AS3:
private function onEnterFrame( e : * ) : void {
var bytes : ByteArray = new ByteArray(); // байт аррей для computeSpectrum
var exBytes : ByteArray = new ByteArray(); // байт аррей для extract
const PLOT_HEIGHT:int = 100;
const CHANNEL_LENGTH:int = 256;
SoundMixer.computeSpectrum( bytes );
//SoundMixer.computeSpectrum( exBytes );
_sound.extract( exBytes, 256, _soundChannel.position * 44.1 );
bytes.position = 0;
exBytes.position = 0;
var g : Graphics = _place.graphics;
g.clear();
g.lineStyle(0, 0x6600CC);
g.beginFill(0x6600CC);
g.moveTo(_x, PLOT_HEIGHT);
// читаем данные от computeSpectrum
var n:Number = 0;
for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
//bytes.readFloat();
n = (bytes.readFloat() * PLOT_HEIGHT);
g.lineTo(i * 2 + _x, PLOT_HEIGHT - n);
}
g.lineTo(CHANNEL_LENGTH * 2 + _x, PLOT_HEIGHT);
g.endFill();
g.lineStyle(0, 0x6600CC);
g.beginFill(0x6600CC);
g.moveTo(_x, PLOT_HEIGHT + 300);
// читаем данные от sound.extract()
var n:Number = 0;
for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
n = (exBytes.readFloat() * PLOT_HEIGHT);
g.lineTo(i * 2 + _x, PLOT_HEIGHT - n + 300);
exBytes.readFloat();
}
g.lineTo(CHANNEL_LENGTH * 2 + _x, PLOT_HEIGHT + 300);
g.endFill();
}