Я создал простой скрипт Web Audio API, который транслирует локальный mp3 и имеет контроль усиления и 3-полосный эквалайзер.
Узлы настроены таким образом, что источник подключается к узлу усиления, а затем подключается к узлу нижних, полосовых и верхних частот. Каждый из этих узлов подключается к усилению перед подключением к месту назначения. Это простой эквалайзер. (схемы и код ниже)
Это отлично работает на моем рабочем столе Windows 8 с i7 и 16 ГБ ОЗУ, однако, когда я пытаюсь запустить это на моем Chromebook Acer C7 с процессором Celeron и 2 ГБ ОЗУ, звук искажается. Звучит так, как будто каждый из разделенных путей не синхронизирован. Также кажется, что темп увеличился. Вы можете увидеть/услышать это в видео на YouTube ниже.
Процессор Celeron должен легко справиться с 3-полосным эквалайзером. Могу ли я что-нибудь сделать, чтобы этого не произошло? Кто-нибудь сталкивался с подобными проблемами на бюджетном оборудовании?
Как всегда спасибо за ваши ответы. Продолжай быть классным.
Примечание. Если я не разделяю источник звука, звук воспроизводится нормально.
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]);
}