为什么在快速更新PannerNode的位置时会出现音频点击/弹出声? [英] Why are audio clicks/pops occurring when the position of a PannerNode is updated rapidly?

查看:0
本文介绍了为什么在快速更新PannerNode的位置时会出现音频点击/弹出声?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我曾希望通过引入位置作为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);

推荐答案

您正在从一个位置瞬间移动到另一个位置。我当然会期待点击,这取决于你是如何移动到哪里的。

如果您有Chrome Canary,您应该能够使用自动化(但不要使用不支持自动化的setPosition())。如果你有一个例子,它仍然点击自动化,请张贴它;我希望看到这样的例子。

这篇关于为什么在快速更新PannerNode的位置时会出现音频点击/弹出声?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆