javascript - 如何理解 Web Audio API panner 节点的 "distance"方法之间的关系

标签 javascript html5-audio web-audio-api

我目前正在尝试理解并更好地理解以下方法之间的关系

listener.setPosition(x,y,z);
panner.setPosition(x,y,z);

从现在开始,我将描述我认为我所知道的,希望一些人会告诉我我错在哪里并纠正我。

现在,在最基本的情况下,我想象一个具有这两个“位置”的球体在中间占据同一个位置。在某种程度上,您可以将 panner.setPosition 和 listener.setPosition() 视为我们假设球体中的两个物理“事物”。

现在,当您更改一个坐标时,您会相对于另一个移动它。

所以混淆的一点就是这个。据我了解,这两种方法的坐标不是任何特定值,但是与 1 和 -1 确定中间 0 的范围的 x 值不同,z 索引实际上似乎确实有一个值,因此,如果我给它一个正值,它确实会“将声音推得更远”(或者更确切地说 - 衰减它)。例如,0 很近,200 很远。这是什么值(value)?

部分答案:

1 到 -1 很难向右/向左的原因是因为 z 设置为零,因此听者与声像节点表示的“声源”之间的空间为 0。我仍然不清楚 z 索引的“值”是多少。

我的其他问题:

1.

如果您有一个假想的“世界”,其中一个假想的人正在靠近或远离声源,您应该对听众的 z 坐标进行编程还是对声相器的 z 坐标进行编程。我问这个的原因是因为 in this example声像器已编程,听者停留在同一个地方,但 UI 提示听者正在向声源移动。我想这个问题更多的是关于最佳实践,因为它似乎都行得通。

2. 当我通过默认声相器节点运行任何声音时,它听起来确实不同(更加低沉和“密集”,几乎就像同一音频文件的两个实例同时播放或高音被抵消一样)。我假设因为是这种情况,所以程序员应该知道一些“设置”的高潮来解决这个问题。我很想知道 that 是什么。

如果你想要一个并排的例子,下面是两个 JSfiddle 例子。一个使用平移器节点,一个不使用。打开它们并在耳机中聆听的同时并排播放文件,差异很细微但很明显。

JSfiddle with panner node

JSfiddle without panner node

最佳答案

0 is close and 200 is far for example. What value is this?

我认为数字是任意单位。关于 distanceModel 的部分给出了根据声源和听者之间的距离计算增益变化的公式。

规范还提到“PannerNode 将输入音频信号缩放/乘以 distanceGain”

您问题的答案:

Q1。 - 你应该对听众的 z 坐标进行编程还是对平移器的 z 坐标进行编程

这实际上取决于您的应用程序。 API 设计为每个 AudioContext 有一个 Listener。但是您可以创建多个 AudioSources,每个 AudioSources 都附加一个 PannerNode。您可以将其想象成一堆可以在 3D 空间中放置的扬声器(AudioSources),但您自己(Listener)也可以四处移动。在这种情况下,取决于您是否希望声源相对于彼此移动,您可能希望也可能不希望听者移动。

Q2。 - 听起来不一样(更加低沉和“密集”)

我不确定。我以前没有遇到过这个。你能举个例子/演示吗?

基于 trying the various panning models ,似乎低沉的音频是使用 HRTF 平移模型的结果。 HRTF 脉冲响应肯定没有平坦的频率响应,并且会使音频变色。您可以改用 equalpower 平移模型。

请注意,尽管在即将到来的 WebAudio 更改中,其中很多事情都会发生变化。您可以在这里阅读更多相关信息 https://github.com/WebAudio/web-audio-api/issues/372

关于javascript - 如何理解 Web Audio API panner 节点的 "distance"方法之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645235/

相关文章:

javascript - 如何使用jquery分割输入值?

javascript - iOS 中 html5 音频限制的功能测试?

javascript - Tone.js 无法与 React 一起使用

javascript - 录制音频、同步循环、偏移延迟和导出部分

javascript - 我可以多次调用 OfflineContext 的 startRendering 吗?

javascript - Safari 网络音频可视化工具适用于 mp3 文件,但不适用于流

javascript - 我有几千个 javascript 对象,我需要显示和滚动它们。我有什么选择?

c# - 稳步减慢从 javascript 到 WCF 服务的 ajax 调用

javascript - 我如何使用 Service Worker 向我的所有 API 请求添加 Authorization header ,这是否有意义?

javascript - 使用音频元素的 play 方法作为 setTimeout 的回调,为什么不呢?