У меня недостаточно репутации, чтобы комментировать ваш вопрос, поэтому я напишу этот ответ с оговоркой, дайте мне знать, если это не решит вашу проблему.
Каждый призыв к звуку.extract будет просто извлекать из того места, где завершился предыдущий вызов sound.extract, поэтому вам не нужно каждый раз использовать аргумент startPosition.Вот почему вы получили странные результаты, призыв к sound.extract уже продвигался по звуку:
sound.extract(byteArray, 2048) // advances 2048 samples into the sound
sound.extract(byteArray, 2048) // we are 2048 samples in, grab another 2048
sound.extract(byteArray, 2048) // we are 4096 samples in, grab another 2048, etc.
Что еще более важно, то, как вы его сейчас получаете, на самом деле не останавливает зависание проигрывателя Flashна длинный звук, потому что вы делаете все это в одном цикле в любом случае.Захватить 500 * 2048 (1 024 000) шагов в цикле не лучше, чем просто захватить их все одновременно с помощью sound.extract (byteArray, 1024000).Во всяком случае, это медленнее.Вам нужно дать Flash время «дышать» между вызовами к sound.extract.
Вот возможное решение:
class SoundLoader
{
public var sound:Sound;
public var byteArray:ByteArray;
public var samplesInSound:int;
public function SoundLoader(sound:Sound)
{
this.sound = sound;
samplesInSound = sound.length * 44.1;
byteArray = new ByteArray();
}
// Returns "true" if the sound has finished extracting.
public function extract(samplesToExtract:int):Boolean
{
var extracted:int = sound.extract(byteArray, samplesToExtract);
return extracted < samplesToExtract;
}
}
function soundLoaded(e:Event)
{
soundLoader = new SoundLoader(sound);
// 2048 is very low, you'll need to experiment with how much you can load at once without Flash hiccupping.
if (soundLoader.extract(2048))
{
// A very short sound! soundLoader.byteArray contains the extracted sound, ready to use.
}
else
{
// add a timer that calls soundLoader.extract(2048) again.
// keep repeating the timer until soundLoader.extract returns 'true' - then you can use soundLoader.byteArray.
// the timer allows Flash to do other things inbetween, which avoids it freezing up.
}
}