AudioNode

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

AudioNode 接口是一个表示音频处理模块的通用接口。

示例包括

EventTarget AudioNode

注意: AudioNode 可以是事件的目标,因此它实现了 EventTarget 接口。

实例属性

AudioNode.context 只读

返回关联的 BaseAudioContext,即表示该节点参与其中的处理图的对象。

AudioNode.numberOfInputs 只读

返回输入到该节点的输入数量。源节点被定义为 numberOfInputs 属性值为 0 的节点。

AudioNode.numberOfOutputs 只读

返回从该节点输出的输出数量。目的地节点(如 AudioDestinationNode)的此属性值为 0

AudioNode.channelCount

表示一个整数,用于确定在对节点输入的连接进行上混和下混时使用的通道数。它的使用和精确定义取决于 AudioNode.channelCountMode 的值。

AudioNode.channelCountMode

表示一个枚举值,描述了节点输入和输出之间通道的匹配方式。

AudioNode.channelInterpretation

表示一个枚举值,描述了通道的含义。这种解释将定义音频上混和下混将如何发生。可能的值为 "speakers""discrete"

实例方法

也实现了 EventTarget 接口的方法。

AudioNode.connect()

允许我们将此节点的输出连接到另一个节点的输入,无论是作为音频数据还是作为 AudioParam 的值。

AudioNode.disconnect()

允许我们将当前节点与已连接的另一个节点断开连接。

描述

音频路由图

AudioNodes participating in an AudioContext create an audio routing graph.

每个 AudioNode 都有输入和输出,多个音频节点连接起来构建一个处理图。该图包含在一个 AudioContext 中,每个音频节点只能属于一个音频上下文。

源节点没有输入但有一个或多个输出,可用于生成声音。另一方面,目的地节点没有输出;相反,它的所有输入都直接播放到扬声器(或音频上下文使用的任何音频输出设备)。此外,还有处理节点,它们有输入和输出。具体的处理因 AudioNode 而异,但总的来说,一个节点读取其输入,进行一些与音频相关的处理,并为其输出生成新值,或者让音频通过(例如在 AnalyserNode 中,处理结果会单独访问)。

图中的节点越多,延迟就越高。例如,如果图的延迟为 500ms,当源节点播放声音时,需要半秒钟才能在扬声器上听到该声音(甚至更长,因为底层音频设备的延迟)。因此,如果需要交互式音频,请尽量使图尽可能小,并将用户控制的音频节点放在图的末尾。例如,音量控制(GainNode)应该是最后一个节点,以便音量更改能够立即生效。

每个输入和输出都有一定数量的通道。例如,单声道音频有一个通道,而立体声音频有两个通道。Web Audio API 会根据需要上混或下混通道数量;有关详细信息,请参阅 Web Audio 规范。

有关所有音频节点列表,请参阅 Web Audio API 主页。

创建 AudioNode

有两种方法可以创建 AudioNode:通过构造函数和通过工厂方法

js
// constructor
const analyserNode = new AnalyserNode(audioCtx, {
  fftSize: 2048,
  maxDecibels: -25,
  minDecibels: -60,
  smoothingTimeConstant: 0.5,
});
js
// factory method
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 2048;
analyserNode.maxDecibels = -25;
analyserNode.minDecibels = -60;
analyserNode.smoothingTimeConstant = 0.5;

您可以自由使用构造函数或工厂方法,或者混合使用两者,但是使用构造函数有一些优点

  • 所有参数都可以在构造时设置,无需单独设置。
  • 您可以对音频节点进行子类化。虽然实际处理由浏览器内部完成且无法更改,但您可以编写一个音频节点的包装器来提供自定义属性和方法。
  • 性能略好:在 Chrome 和 Firefox 中,工厂方法都会在内部调用构造函数。

简史: Web Audio 规范的第一个版本仅定义了工厂方法。在 2013 年 10 月的设计评审之后,决定添加构造函数,因为它们比工厂方法有许多优点。构造函数已从 2016 年 8 月到 10 月添加到规范中。工厂方法仍包含在规范中,并未弃用。

示例

这段简单的代码片段展示了如何创建一些音频节点,以及如何使用 AudioNode 的属性和方法。您可以在 Web Audio API 登录页面的任何示例(例如 Violent Theremin)中找到此类用法的示例。

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

规范

规范
Web Audio API
# AudioNode

浏览器兼容性

另见