Проблемы производительности с API веб-аудио

Я создал простой скрипт Web Audio API, который транслирует локальный mp3 и имеет контроль усиления и 3-полосный эквалайзер.

Узлы настроены таким образом, что источник подключается к узлу усиления, а затем подключается к узлу нижних, полосовых и верхних частот. Каждый из этих узлов подключается к усилению перед подключением к месту назначения. Это простой эквалайзер. (схемы и код ниже)

Это отлично работает на моем рабочем столе Windows 8 с i7 и 16 ГБ ОЗУ, однако, когда я пытаюсь запустить это на моем Chromebook Acer C7 с процессором Celeron и 2 ГБ ОЗУ, звук искажается. Звучит так, как будто каждый из разделенных путей не синхронизирован. Также кажется, что темп увеличился. Вы можете увидеть/услышать это в видео на YouTube ниже.

http://youtu.be/mB3gdjUwQfw

Процессор Celeron должен легко справиться с 3-полосным эквалайзером. Могу ли я что-нибудь сделать, чтобы этого не произошло? Кто-нибудь сталкивался с подобными проблемами на бюджетном оборудовании?

Как всегда спасибо за ваши ответы. Продолжай быть классным.

Примечание. Если я не разделяю источник звука, звук воспроизводится нормально.


SimpleAudioMap

function setupChain(outNode) {
        soundSource = context.createBufferSource();
        soundSource.buffer = audioBuffer;

        volumeNode = context.createGainNode();
        volumeNode.gain.value = gainValue;

        highPassFilter = context.createBiquadFilter();
        highPassFilter.type = 1;
        highPassFilter.frequency.value = 4000;
        highPassGain = context.createGainNode();
        highPassGain.gain.value = highValue;

        medPassFilter = context.createBiquadFilter();
        medPassFilter.type = 2;
        medPassFilter.frequency.value = 2125;
        medPassFilter.Q = 1.1333333333333333;
        medPassGain = context.createGainNode();
        medPassGain.gain.value = medValue;

        lowPassFilter = context.createBiquadFilter();
        lowPassFilter.type = 0;
        lowPassFilter.frequency.value = 250;
        lowPassGain = context.createGainNode();
        lowPassGain.gain.value = lowValue;

        // Wiring
        volumeNode.connect(lowPassFilter);
        lowPassFilter.connect(lowPassGain);
        lowPassGain.connect(outNode);

        volumeNode.connect(medPassFilter);
        medPassFilter.connect(medPassGain);
        medPassGain.connect(outNode);

        volumeNode.connect(highPassFilter);
        highPassFilter.connect(highPassGain);
        highPassGain.connect(outNode);

        return volumeNode;
    }

function stopSound() {
  if (source) {
    source.noteOff(0);
  }
}

function playSound() {
  // source is global so we can call .noteOff() later.
  source = context.createBufferSource();
  source.buffer = audioBuffer;
  source.loop = false;
  source.connect(setupChain(context.destination));
  source.noteOn(0); // Play immediately.
}

function initSound(arrayBuffer) {
  context.decodeAudioData(arrayBuffer, function(buffer) {
    // audioBuffer is global to reuse the decoded audio later.
    audioBuffer = buffer;
    var buttons = document.querySelectorAll('button');
    buttons[0].disabled = false;
    buttons[1].disabled = false;
  }, function(e) {
    console.log('Error decoding file', e);
  }); 
}


var fileChangeEventListener = function(e) {  
  var reader = new FileReader();
  reader.onload = function(e) {
    initSound(this.result);
  };
  reader.readAsArrayBuffer(this.files[0]);
}

person Chris Gonzales    schedule 08.06.2013    source источник


Ответы (1)


Для простого 3-полосного эквалайзера я мог бы предложить попробовать lowshelf, Peaking и Highshelf для ваших биквадратных фильтров. Таким образом, вы можете устранить все эти дополнительные узлы усиления, поскольку эти типы фильтров принимают значение усиления, и вам не придется разделять сигнал. Фильтры можно просто соединить последовательно.

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

Кроме того, когда вы подключаетесь параллельно, у вас больше шансов получить фазовые странности. biQuad 1 пытается удалить ваши низкие частоты, но они все еще присутствуют в biQuad 2 и biQuad 3. Таким образом, ваши фильтры как бы дерутся друг с другом.

person Kevin Ennis    schedule 08.06.2013
comment
Как сказал Кевин, НЕ рекомендуется параллельно реализовывать регуляторы низких/средних/высоких частот с фильтрами LP/BP/HP. Фазовые изменения вызовут много проблем для гармонического содержания. - person cwilso; 10.06.2013
comment
Работал как шарм. Я должен был понять это раньше. Большое спасибо! - person Chris Gonzales; 11.06.2013
comment
Кроме того, граф, изображенный OP, должен работать безупречно без проблем с производительностью даже на картофеле. Я делаю здесь графики, которые более чем в 500 раз сложнее (исключительно из-за количества узлов), и проблем с производительностью нет. - person John Weisz; 09.06.2017