Доброе утро!
Я пытаюсь создать визуальную форму волны для MP3. Код, который я включил, вызывается при успешной загрузке MP3. Я намерен извлечь лишь несколько важных сэмплов из звука, чтобы создать форму волны, а не извлекать весь звук в байтовый массив. Даже на хорошей машине извлечение всей песни может привести к зависанию вспышки на 3-5 секунд (или дольше!). Для моих целей это невозможно.
К сожалению, код, который я получил ниже, не может произвести никаких чисел. Если я извлекаю всю песню, она функционирует, но извлечение только ключевых моментов мне ничего не дает. Делает ли выполнение извлечения остаток звукового объекта недействительным для будущих извлечений? Если это так, есть ли способ избежать этого, который не остановит вспышку в течение длительного периода времени во время извлечения?
Некоторые важные переменные из остального кода:
waveFormWidth: статическая ширина спрайта формы волны.
waveFormHeight: статическая высота спрайта формы волны.
song: звуковой объект, который я буду использовать для создания формы волны.
public function mapWaveForm(e:Event = null):void
{
// Clear the wave form sprite
waveForm.graphics.clear();
waveForm.graphics.lineStyle(0, 0x000000, 1);
// Storage for the wave form bit data
var byteOutput:ByteArray;
var leftPeakSize:Number;
var rightPeakSize:Number;
var songTotalSamples:int;
var thisSample:int;
byteOutput = new ByteArray();
// How many samples?
songTotalSamples = (song.length * 44.1);
// Loop for the wave form width
for (var peakCount:int = 0; (peakCount < waveFormWidth); peakCount++)
{
// Get info at each peak.
thisSample = Math.floor(songTotalSamples * (peakCount / waveFormWidth));
song.extract(byteOutput, 1, thisSample);
byteOutput.position = 0;
trace(thisSample, byteOutput.readFloat());
leftPeakSize = byteOutput.readFloat() / 1.27;
rightPeakSize = byteOutput.readFloat() / 1.27;
// Turn those peaks into something usable.
leftPeakSize = leftPeakSize * (waveFormHeight * .5);
rightPeakSize = rightPeakSize * (waveFormHeight * .5);
// Make the left channel line
waveForm.graphics.moveTo(peakCount, (waveFormHeight * .5));
waveForm.graphics.lineTo(peakCount, (waveFormHeight * .5) - leftPeakSize);
// Make the right channel line
waveForm.graphics.moveTo(peakCount, (waveFormHeight * .5));
waveForm.graphics.lineTo(peakCount, (waveFormHeight * .5) + rightPeakSize);
}
}
Спасибо за вашу помощь, ребята!