为什么PannerNode的位置快速更新时会出现音频clicks/pops?

Why are audio clicks/pops occurring when the position of a PannerNode is updated rapidly?

我已经尝试使用 PannerNode 一段时间了,在我使用 requestAnimationFrame() 或 setInterval() 重复更新平移器位置的情况下,我注意到 clicking/popping音频。

为什么会发生这种情况,如何解决?

我希望通过引入 position 作为 AudioParam 来解决这个问题,或者我可以通过使用 ramp 来绕过这个问题。我已经尝试在 Chrome Canary 上设置带坡道和不带坡道的位置,但问题仍然存在。

您可以在这里亲自聆听:https://jsfiddle.net/txLke4fh/

代码片段:

var ctx = new AudioContext();
var osc = ctx.createOscillator();
var panner = ctx.createPanner();
var temp = true;

osc.frequency.value = 220;
osc.connect(panner);

panner.panningModel = 'HRTF';
panner.setPosition(0, 0, 0);
panner.connect(ctx.destination);

osc.start(0);
osc.stop(ctx.currentTime + 10);

setInterval(function() {
  if (temp) {
    panner.setPosition(50, 0, 0);
    temp = false;
  } else {
    panner.setPosition(-50, 0, 0);
    temp = true;
  }
}, 100);

编辑:在 Chrome Canary 上也可以观察到,有和没有线性斜坡。

var ctx = new AudioContext();
var osc = ctx.createOscillator();
var panner = ctx.createPanner();
var temp = true;

osc.frequency.value = 220;
osc.connect(panner);

panner.panningModel = 'HRTF';
panner.positionX.value = 0;
panner.connect(ctx.destination);

osc.start(0);
osc.stop(ctx.currentTime + 10);

setInterval(function() {
  if (temp) {
    panner.positionX.linearRampToValueAtTime(50, ctx.currentTime + 0.01);
    temp = false;
  } else {
    panner.positionX.linearRampToValueAtTime(-50, ctx.currentTime + 0.01);
    temp = true;
  }
}, 1000);

您正在进行从一个位置到另一个位置的瞬时移动。我当然希望点击一下,具体取决于您移动的位置。

如果您有 Chrome 金丝雀,您应该能够使用自动化(但不要使用不执行自动化的 setPosition())。如果你有一个例子,它仍然点击自动化,请 post 它;我想看看这样的例子。