音频节点
基线 广泛可用
此功能已成熟,并在许多设备和浏览器版本中运行。它自 2021 年 4 月.
报告反馈
AudioNode
接口是表示音频处理模块的通用接口。
- 例如
- 音频源(例如 HTML
<audio>
或<video>
元素,OscillatorNode
等), - 音频目的地,
- 中间处理模块(例如
BiquadFilterNode
或ConvolverNode
等过滤器),或
音量控制(例如 GainNode
)
实例属性
- 注意:
AudioNode
可以是事件的目标,因此它实现了EventTarget
接口。 - 返回关联的
BaseAudioContext
,即表示节点参与的处理图的对象。 - 返回馈送节点的输入数量。源节点被定义为具有值为
0
的numberOfInputs
属性的节点。 返回从节点输出的输出数量。目的地节点(例如
AudioDestinationNode
)对此属性的值为0
。-
AudioNode.channelCount
表示一个整数,用于确定 上混和下混 连接到节点的任何输入时使用的声道数。它的用法和精确定义取决于
AudioNode.channelCountMode
的值。-
AudioNode.channelCountMode
表示一个枚举值,描述了节点的输入和输出之间必须匹配声道的 방식。
-
AudioNode.channelInterpretation
实例方法
表示一个枚举值,描述了声道的含义。这种解释将定义音频 上混和下混 的方式。可能的值为 "speakers"
或 "discrete"
。
还实现了接口
EventTarget
中的方法。-
AudioNode.connect()
允许我们将此节点的输出连接到另一个节点的输入,作为音频数据或
AudioParam
的值。-
AudioNode.disconnect()
描述
允许我们将当前节点与其已连接到的另一个节点断开连接。
音频路由图
每个 AudioNode
都有输入和输出,多个音频节点连接在一起形成一个处理图。此图包含在 AudioContext
中,每个音频节点只能属于一个音频上下文。
一个源节点 有零个输入但有一个或多个输出,并且可用于生成声音。另一方面,一个目的地节点 没有输出;相反,所有输入都直接在扬声器上播放(或音频上下文使用的任何音频输出设备)。此外,还存在具有输入和输出的处理节点。执行的具体处理因 AudioNode
而异,但总的来说,节点读取其输入,执行一些与音频相关的处理,并为其输出生成新值,或者让音频通过(例如在 AnalyserNode
中,处理结果是单独访问的)。
图中的节点越多,延迟就越高。例如,如果你的图的延迟为 500 毫秒,那么当源节点播放声音时,声音将在半秒后才能在你的扬声器上听到(甚至更长,因为底层音频设备也存在延迟)。因此,如果你需要进行交互式音频,请尽可能保持图的大小,并将用户控制的音频节点放在图的末尾。例如,音量控制 (GainNode
) 应该是最后一个节点,以便音量变化立即生效。
每个输入和输出都有给定的声道 数量。例如,单声道音频有一个声道,而立体声音频有两个声道。Web 音频 API 将根据需要上混或下混声道数量;有关详细信息,请查看 Web 音频规范。
有关所有音频节点的列表,请参见 Web 音频 API 主页。
创建 AudioNode
AudioNode
:通过构造函数和通过工厂方法。// constructor
const analyserNode = new AnalyserNode(audioCtx, {
fftSize: 2048,
maxDecibels: -25,
minDecibels: -60,
smoothingTimeConstant: 0.5,
});
AudioNode
:通过构造函数和通过工厂方法。// factory method
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 2048;
analyserNode.maxDecibels = -25;
analyserNode.minDecibels = -60;
analyserNode.smoothingTimeConstant = 0.5;
js
- 您可以随意使用构造函数或工厂方法,或将两者混合使用,但使用构造函数有一些优势。
- 所有参数都可以在构造时设置,不需要单独设置。
- 您可以 子类化音频节点。虽然实际处理是由浏览器在内部完成的,无法更改,但您可以编写一个音频节点的包装器,以提供自定义属性和方法。
性能略有提升:在 Chrome 和 Firefox 中,工厂方法在内部调用构造函数。
示例
简要历史:Web 音频规范的第一个版本只定义了工厂方法。在 2013 年 10 月的设计审查 之后,决定添加构造函数,因为它们比工厂方法有很多优势。构造函数从 2016 年 8 月到 10 月被添加到规范中。工厂方法继续包含在规范中,并没有被弃用。
AudioNode
:通过构造函数和通过工厂方法。const audioCtx = new AudioContext();
const oscillator = new OscillatorNode(audioCtx);
const gainNode = new GainNode(audioCtx);
oscillator.connect(gainNode).connect(audioCtx.destination);
oscillator.context;
oscillator.numberOfInputs;
oscillator.numberOfOutputs;
oscillator.channelCount;
规范
这段简单的代码片段展示了如何创建一些音频节点,以及如何使用 AudioNode 属性和方法。您可以在 Web 音频 API 着陆页上链接的任何示例中找到此类用法的示例(例如 暴力特雷门)。 |
---|
Web 音频 API # 音频节点 |
浏览器兼容性
规范