为什么在PannerNode的位置快速更新时会发生音频点击/弹出?

时间:2016-06-28 23:50:39

标签: web-audio

我已经尝试使用PannerNode很长一段时间了,如果我使用requestAnimationFrame()或setInterval()重复更新panner的位置,我注意到点击了/弹出音频。

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

我希望通过引入位置作为AudioParam来修复它,或者我可以通过使用斜坡来解决问题。我已尝试在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);

1 个答案:

答案 0 :(得分:0)

你正在从一个位置瞬间移动到另一个位置。我当然希望点击一下,具体取决于你搬家的方式。

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