【问题标题】:Why are audio clicks/pops occurring when the position of a PannerNode is updated rapidly?为什么 PannerNode 的位置快速更新时会出现音频点击/弹出?
【发布时间】:2016-06-30 01:20:49
【问题描述】:

我已经用 PannerNode 试验了很长一段时间,在我使用 requestAnimationFrame() 或 setInterval() 反复更新 panner 位置的情况下,我注意到点击/弹出音频。

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

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

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

代码sn-p:

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);

【问题讨论】:

    标签: web-audio-api


    【解决方案1】:

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

    如果你有 Chrome canary,你应该可以使用自动化(但不要使用setPosition(),它不会做自动化)。如果您有一个仍然可以通过自动化点击的示例,请发布它;我想看看这样的例子。

    【讨论】:

    • 当你提到自动化时,我以为你的意思是使用坡道,所以如果我误解了请纠正我。另外,有什么方法可以避免使用 setPosition() 的点击?
    • 是的,我的意思是使用新的positionXpositionYpositionZ AudioParams 来使用斜坡。你可以用setPosition 做的最好的事情就是不要突然移动。但是 Chrome 中存在一个问题,如果您确实顺利移动,仍然会出现故障。 Chrome beta 已修复(并添加了 positionX 以实现自动化。
    • 我在问题中添加了自动位置更新代码。我使用了一个坡道来改变位置,不幸的是,点击仍然存在。
    • 感谢您的示例。让我看看。
    • 好的。在同事的帮助下,这工作正常。这里有两个问题。一是你的运动经过原点。那里有一个不连续性,所以你可以点击一下。将初始 X、Y、Z 位置设置为远离原点。另一个问题是您的移动速度非常快(0.01 秒内 +50 到 -50)。如果以米为单位,那将比音速(约 30 马赫)更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多