Я довольно долго экспериментировал с PannerNode, и в тех случаях, когда я постоянно обновляю позицию плеера, используя либо requestAnimationFrame(), либо 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);
EDIT: Это можно наблюдать на 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);
Когда вы упомянули о автоматизации, я предположил, что вы имели в виду использование рампы, поэтому, пожалуйста, исправьте меня, если я неправильно понял. Кроме того, есть ли способ избежать кликов с помощью setPosition()? – nikhilbhanu
Да, я хотел использовать рампу, используя новые 'positionX',' positionY' и 'positionZ' AudioParams. Лучшее, что вы можете сделать с 'setPosition', - это не двигаться внезапно. Но в Chrome возникла проблема, когда, если вы плавно двигались, все еще были сбои. Chrome beta имеет исправление (и добавляет 'positionX' для автоматизации. –
Я добавил автоматический код обновления положения в вопросе. Я использовал рампу для изменения позиции и, к сожалению, клики все еще присутствуют. – nikhilbhanu