AudioNode - 表示音频处理模块的通用接口

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

Examples include:
示例包括:

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

描述

音频路由图

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

一个 “源节点” 具有零输入但一个或多个输出,可用于产生声音。另一方面,_目标节点_没有输出;取而代之的是,其所有输入都直接在扬声器(或音频环境使用的任何音频输出设备)上播放。此外,还有_处理节点_具有输入和输出。从一个 AudioNode 到另一个 AudioNode,所完成的确切处理各不相同,但通常,节点会读取其输入,进行一些与音频相关的处理,并为其输出生成新值,或者只是让音频通过(例如,在AnalyserNode,只访问处理的结果)。

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

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

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

创建 AudioNode

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

//构造函数
const analyserNode = new AnalyserNode(audioCtx, {
  fftSize: 2048,
  maxDecibels: -25,
  minDecibels: -60,
  smoothingTimeConstant: 0.5,
});

//工厂方法
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 2048;
analyserNode.maxDecibels = -25;
analyserNode.minDecibels = -60;
analyserNode.smoothingTimeConstant = 0.5;

您可以自由使用构造函数或工厂方法,也可以将两者混合使用,但是使用构造函数有很多优点:

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

请记住,Microsoft Edge 似乎尚未支持该构造函数。使用构造函数时,它将引发 “Function expected” 错误。

简要历史记录: Web Audio 规范的第一个版本仅定义了工厂方法。经过 2013 年 10 月的设计审查之后,决定添加构造函数,因为它们比工厂方法有很多好处。从 2016 年 8 月到 2016 年 10 月,构造函数已添加到规范中。规范中继续包含工厂方法,但不建议使用。

属性

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

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

实例

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

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 的定义
工作草案 -

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持14≤1825 不支持156
channelCount141225 不支持156
channelCountMode141225 不支持156
channelInterpretation141225 不支持156
connect141225 不支持156
context141225 不支持156
disconnect141225 不支持156
numberOfInputs141225 不支持156
numberOfOutputs141225 不支持156

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 支持18 未知26 未知14 支持
channelCount 支持18 未知26 未知14 支持
channelCountMode 支持18 未知26 未知14 支持
channelInterpretation 支持18 未知26 未知14 支持
connect 支持18 未知26 未知14 支持
context 支持18 未知26 未知14 支持
disconnect 支持18 未知26 未知14 支持
numberOfInputs 支持18 未知26 未知14 支持
numberOfOutputs 支持18 未知26 未知14 支持