2016-06-28 6 views
0

Ich experimentiere seit einiger Zeit mit dem PannerNode und in Fällen, in denen ich die Position des Panners wiederholt mit requestAnimationFrame() oder setInterval() aktualisiere, habe ich festgestellt, dass Audio geklickt wird.Warum werden Audioclicks/Popups angezeigt, wenn die Position eines PannerNodes schnell aktualisiert wird?

Warum passiert das und wie kann es gelöst werden?

Ich hatte gehofft, dass es mit der Einführung der Position als AudioParam behoben werden würde oder ich könnte das Problem umgehen, indem ich eine Rampe benutze. Ich habe versucht, die Position mit und ohne eine Rampe auf Chrome Canary und das Problem ist immer noch vorhanden.

Sie können es hören Sie selbst, hier: https://jsfiddle.net/txLke4fh/

-Code-Schnipsel:

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: Es kann auf Chrome Canary zu beobachten, mit und ohne lineare Rampe.

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); 

Antwort

0

Sie machen eine sofortige Bewegung von einer Position zur anderen. Ich würde sicherlich einen Klick erwarten, abhängig davon, wo Sie sich bewegt haben.

Wenn Sie Chrome Canary haben, sollten Sie in der Lage sein, Automatisierung zu verwenden (aber verwenden Sie nicht setPosition(), die keine Automatisierung durchführt). Wenn Sie ein Beispiel dafür haben, wo es noch mit Automatisierung klickt, schreiben Sie es bitte; Ich würde gerne ein solches Beispiel sehen.

+0

Wenn Sie Automation erwähnt haben, nahm ich an, Sie wollten eine Rampe benutzen. Bitte korrigieren Sie mich, wenn ich falsch verstanden habe. Gibt es auch eine Möglichkeit, die Klicks mit setPosition() zu vermeiden? – nikhilbhanu

+0

Ja, ich wollte eine Rampe mit den neuen AudioParams 'positionX',' positionY' und 'positionZ' verwenden. Das Beste, was Sie mit 'setPosition' machen können, ist, dass Sie sich nicht abrupt bewegen. Aber in Chrome gab es ein Problem, bei dem es, wenn Sie sich reibungslos bewegten, immer noch zu Störungen kam. Chrome Beta hat das Update (und fügt 'positionX' für die Automatisierung hinzu. –

+0

Ich fügte den automatisierten Positionsaktualisierungscode in der Frage hinzu. Ich benutzte eine Rampe für die Änderung der Position und leider sind die Klicks immer noch vorhanden. – nikhilbhanu