Я пытаюсь создать параметрический эквалайзер во Flash. Я искал способ прочитать аудиоданные и поэкспериментировать с сэмплами, прежде чем Flash воспроизведет их на лету. Загрузка звука в один объект Sound и использование Sound.extract () для чтения данных, их обработка, затем воспроизведение второго второго пустого объекта Sound и запись данных в его событие sampleData, кажется, способ сделать это (пожалуйста, исправьте меня если я ошибаюсь или есть лучший способ).
Есть ли способ использовать Sound.extract (), пока объект Sound все еще загружает звуковой файл? Я не хочу ждать загрузки всего звукового файла перед его воспроизведением. К сожалению, всякий раз, когда я использую Sound.extract () во время загрузки объекта Sound, он возвращает байтовый массив нулевой длины.
Есть ли способ дождаться достаточного количества сэмплов для загрузки, прежде чем играть? Я полагаю, что у меня снова возникнет та же проблема, когда Flash-ролик съедает все загруженные сэмплы, пока звуковой файл все еще загружается.
Вот упрощенная версия моего кода. Пока это работает, но только когда я жду, когда объект Sound вызовет событие Event.COMPLETE.
var inputSound:Sound = new Sound();
inputSound.load("somefile.mp3");
inputSound.addEventListener(Event.COMPLETE, loadComplete);
var outputSound:Sound = new Sound();
outputSound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSamples);
var sc:SoundChannel;
/*if I called ouputSound.play() right now, it wouldn't work.*/
function loadComplete(e:Event) : void
{
sc = outputSound.play();
}
function processSamples(e:SampleDataEvent) : void
{
var samples:ByteArray = new ByteArray();
var len:int = snd.extract(samples, 8192);
var sample:Number;
var i:int = 0;
trace(len.toString());
samples.position = 0;
//TODO: Sound Processing here
//The following code plays a sine wave over the input sound as a test
while (samples.bytesAvailable)
{
i++;
sample = samples.readFloat();
sample += Math.sin(i * Math.PI / 256) * 0.5;
e.data.writeFloat(sample);
sample = samples.readFloat();
sample += Math.sin(i * Math.PI / 256) * 0.5;
e.data.writeFloat(sample);
}
}
РЕДАКТИРОВАТЬ: Если я попытаюсь использовать событие PROGRESS, мне нужно будет сделать намного больше вещей низкого уровня для реализации буферизации и еще чего-нибудь (что еще мне нужно учитывать?). Может ли кто-нибудь помочь мне с этим? Кроме того, есть ли способ определить положение образца в миллисекундах? Должен ли я считать, что все звуковые файлы являются стереофоническими 44,1 кГц (их может и не быть), или есть лучший способ?