我已经尝试使用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);
答案 0 :(得分:0)
你正在从一个位置瞬间移动到另一个位置。我当然希望点击一下,具体取决于你搬家的方式。
如果你有Chrome金丝雀,你应该能够使用自动化(但不要使用不能自动化的setPosition()
)。如果您有自动点击的示例,请发布;我想看看这样一个例子。