2016-06-28 1 views
0

Я довольно долго экспериментировал с 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); 

ответ

0

Вы совершаете мгновенное перемещение из одной позиции в другую. Я, конечно, ожидал бы щелчка, в зависимости от того, как вы переехали.

Если у вас есть Chrome canary, вы должны иметь возможность использовать автоматизацию (но не используйте setPosition(), который не выполняет автоматизацию). Если у вас есть пример того, где он все еще нажимает автоматизацию, отправьте его; Я бы хотел увидеть такой пример.

+0

Когда вы упомянули о автоматизации, я предположил, что вы имели в виду использование рампы, поэтому, пожалуйста, исправьте меня, если я неправильно понял. Кроме того, есть ли способ избежать кликов с помощью setPosition()? – nikhilbhanu

+0

Да, я хотел использовать рампу, используя новые 'positionX',' positionY' и 'positionZ' AudioParams. Лучшее, что вы можете сделать с 'setPosition', - это не двигаться внезапно. Но в Chrome возникла проблема, когда, если вы плавно двигались, все еще были сбои. Chrome beta имеет исправление (и добавляет 'positionX' для автоматизации. –

+0

Я добавил автоматический код обновления положения в вопросе. Я использовал рампу для изменения позиции и, к сожалению, клики все еще присутствуют. – nikhilbhanu

Смежные вопросы