Нужна помощь с AS3 Sound.extract () - PullRequest
2 голосов
/ 16 июля 2010

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

1 Ответ

5 голосов
/ 19 июля 2010

Проверьте решение в этом посте здесь

Как вычислить область просмотра из полосы прокрутки?

Вам не нужно извлекать весь трек в байтовый массив.Вам действительно нужно получить то, что вам нужно, когда вам это нужно.

Если вы действительно хотите извлечь дорожку за один раз, вы можете использовать

sound.extract(yourbytearray,sound.lenght*44.1)

// lenght *44.1 gives you the number of samples if the mp3 is encoded at 44100

, у вас есть все ваши данные PCM.в вашем обработчике примеров процессов вместо вызова звукового извлечения вы бы сделали что-то вроде

if(yourbytearray.bytesAvailable==0)
{
  yourbytearray.position==0
}

var left:Number = youbytearray.readFloat

var right:Number = youbytearray.readFloat

//process the left with eq

//process the right with eq

event.data.writeFloat(left);
event.data.writeFloat(right);

Извлечение всего аудио за раз, вероятно, было бы самым простым, но у вас возникнут проблемы с памятью для mp3-файлов более чем на 8 минут..

В целом сэмплы миллисекундные вещи .....

bytearray.position / bytearray.lenght дает вам место в вашей песне.

Разделите это на 44100и это даст вам количество миллисекунд.

Задайте больше вопросов, если вам понадобится, чтобы я что-то выяснил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...