为什么在快速更新PannerNode的位置时会出现音频点击/弹出声? [英] Why are audio clicks/pops occurring when the position of a PannerNode is updated rapidly?
本文介绍了为什么在快速更新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屋!
查看全文