2

我创建了一个简单的 Web 音频 API 脚本,它可以流式传输本地 mp3,并具有增益控制和 3 频段均衡器。

设置节点,使源连接到增益节点,然后切分到低通、带通和高通节点。这些节点中的每一个在连接到目的地之前都连接到增益。这是一个简单的均衡器。(下面的图表和代码)

这在我的带有 i7 和 16GB RAM 的 Windows 8 桌面上运行良好,但是当我尝试在带有 Celeron 处理器和 2GB RAM 的 Acer C7 Chromebook 上运行它时,音频会出现乱码。听起来好像每个拆分路径都不同步。听起来节奏也加快了。您可以在下面的 youtube 视频中看到/听到这一点。

http://youtu.be/mB3gdjUwQfw

赛扬处理器应该能够轻松处理 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]);
}
4

1 回答 1

5

对于一个简单的 3 段 EQ,我可能会建议为您的双二阶滤波器尝试 lowshelf、peaking 和 highshelf。这样,您可以消除所有这些额外的增益节点,因为这些滤波器类型接受增益值 - 您不必拆分信号。过滤器可以串联连接。

通过消除所有这些分裂并保持单一信号路径,您可以保证没有任何东西会失去同步。

另外,当您并行连接时,您更有可能出现相位异常。biQuad 1 试图消除你的低点,但它们仍然存在于 biQuad 2 和 biQuad 3 中。所以你的过滤器有点互相争斗。

于 2013-06-08T13:51:05.967 回答