我在尝试使用Web Audio更新应用程序中context.listener的位置(每个requestAnimationFrame)时遇到麻烦。我制作了一个测试环境here,其中包含一些变体,但似乎没有一个真正起作用。
这是我认为正确的方法:
listener.positionX.value = pos.x;
listener.positionY.value = pos.y;
listener.positionZ.value = pos.z;
我遇到的问题是声音已完全失真,而调低音源音量没有帮助。 (这很可能是Chrome OSX中的错误,因为我以前做过类似的事情(在Chrome Windows上运行)时不记得有任何问题)
我也尝试过这样做(这两行应该完全一样),但这也无济于事:
listener.positionX.setValueAtTime(pos.x, 0);
listener.positionX.setValueAtTime(pos.x, context.currentTime);
然后,我尝试使用旧的且已弃用的命令来执行此操作,这听起来更好,但仍然存在轻微失真:
listener.setPosition(pos.x, pos.y, pos.z);
最有效的方法是进行线性渐变:
listener.positionX.linearRampToValueAtTime(pos.x, context.currentTime + 0.1);
但是在每帧上进行新的斜坡并不是真正正确的方法,因为正在执行的斜坡被取消,并且我认为它将取之前的值作为新斜坡的起始值。另外:当我然后不更新该值时(我在该Codepen中作为一个选项添加了该值),它似乎跳回到了先前的值,这使我认为这也许也是我在听到时出现严重失真的原因采用第一种方法(通过positionX.value = pos.x
设置值)
我是在做错什么,还是我在忽略某些事情?我应该如何正确设置每一帧的收听者位置?
答案 0 :(得分:0)
使用.value
设置器和setPosition
应该立即将侦听器移到该位置。这会引起故障。 (并非所有浏览器都实现了此行为,因此某些浏览器会以某种方式从旧位置平稳地移动到新位置。)
线性斜坡(或其他自动化技术)是从一个位置移动到另一个位置的正确方法。
我没有在使用内置扬声器的Macbook上听到Chrome 71的任何伪影。也许我会用耳机吗?