AudioBufferSourceNode - 表示存储在 AudioBuffer 中由内存中音频数据组成的音频源

AudioBufferSourceNode 接口是一个 AudioScheduledSourceNode,它表示存储在 AudioBuffer 中由内存中音频数据组成的音频源。它对于回放对定时精度要求特别严格的音频,例如对于必须符合特定节奏并且可以保留在内存中而不是从磁盘或网络中播放的声音,它特别有用。要播放需要精确定时但必须从网络传输或从磁盘播放的声音,请使用 AudioWorkletNode 来实现其播放。

AudioBufferSourceNode 没有输入,只有一个输出,其通道数与其 buffer 属性所指示的 AudioBuffer 相同。如果没有设置缓冲区(即,如果 buffernull),则输出包含单个静默通道(每个样本均为 0)。

AudioBufferSourceNode 只能播放一次;在每次调用 start() 之后,如果要再次播放相同的声音,则必须创建一个新节点。幸运的是,这些节点的创建成本非常低廉,实际的 AudioBuffer 可以重新用于声音的多次播放。的确,您可以以 “一劳永逸” 的方式使用这些节点:创建节点,调用 AudioBufferSourceNode 开始播放声音,甚至不必费心去保存对它的引用。它将在适当的时间自动进行垃圾收集,例如直到声音播放完毕后的某个时间。

允许多次调用 stop()。如果 AudioBufferSourceNode 尚未到达缓冲区的末尾,则最近的调用将替换前一个调用。

输入数量 0
输出数量 1
通道数 由关联的 AudioBuffer 定义

构造函数

AudioBufferSourceNode()

创建并返回一个新的 AudioBufferSourceNode 对象。可以使用 AudioContext.createBufferSource() 方法实例化 AudioBufferSourceNode

属性

从其父接口 AudioNode 继承了属性。

AudioBufferSourceNode.buffer

一个 AudioBuffer,表示要播放的音频数据。设置值为 null 时,表示单个静音通道(每个采样为 0.0)。

AudioBufferSourceNode.detune

一个 k-rate AudioParam,表示以 cents 表示的播放失谐。该值与 playbackRate 混合以确定声音的播放速度。其默认值为 0(表示不失谐),其标称范围为 -∞ 至 ∞。

AudioBufferSourceNode.loop

一个布尔属性,表示到达 AudioBuffer 的结尾时是否必须重播音频数据。其默认值为 false

AudioBufferSourceNode.loopStart 可选

一个浮点值,表示 looptrue 时必须开始播放 AudioBuffer 的时间(以秒为单位)。它的默认值为 0(表示在每个循环的开始,从音频缓冲区的开始开始播放)。

AudioBufferSourceNode.loopEnd 可选

一个浮点数,指示 AudioBuffer 的播放停止的时间(以秒为单位),如果 looptrue,则循环返回由 loopStart 指示的时间。默认值为 0

AudioBufferSourceNode.playbackRate

一个 a-rate AudioParam,表示播放音频数据的速度因子,其中值为 1.0 是声音的自然采样率。由于没有在输出上应用音高校正,因此可用于更改样本的音高。该值与 detune 混合以确定最终播放速率。

事件处理程序

从其父接口 AudioScheduledSourceNode 继承了事件处理程序。

方法

从其父接口 AudioScheduledSourceNode 继承了方法。

AudioBufferSourceNode.start()

用于安排播放缓冲区中包含的音频数据,或立即开始播放。

实例

在这个实例中,我们创建了一个两秒钟的缓冲区,用白噪声填充它,然后使用 AudioBufferSourceNode 播放它。注释应清楚地说明正在发生的事情。

您还可以在线运行代码,或查看源代码

var audioCtx = new (window.AudioContext || window.webkitAudioContext)();

// 以 AudioContext 的采样率创建一个空的三秒钟立体声缓冲区
var myArrayBuffer = audioCtx.createBuffer(2, audioCtx.sampleRate * 3, audioCtx.sampleRate);

// 用白噪声填充缓冲区;
// 只需使用 - 1.0 和 1.0 之间的随机值
for (var channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // 这是一个提供了包含数据的实际 ArrayBuffer
  var nowBuffering = myArrayBuffer.getChannelData(channel);
  for (var i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() 默认是 [0; 1.0]
    // 音频需要在 [-1.0; 1.0] 之间
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// 获取一个 AudioBufferSourceNode。
// 这是我们要播放 AudioBuffer 时要使用的 AudioNode
var source = audioCtx.createBufferSource();
// 在 AudioBufferSourceNode 中设置缓冲区
source.buffer = myArrayBuffer;
// 将 AudioBufferSourceNode 连接到目标,以便我们可以听到声音
source.connect(audioCtx.destination);
// 开始播放源
source.start();

有关 decodeAudioData() 的示例,请参见 AudioContext.decodeAudioData()

规范

规范 状态 备注
Web Audio API
AudioBufferSourceNode 的定义
工作草案 -

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持14≤1825 不支持156
AudioBufferSourceNode() 构造函数551≤7953 不支持42 未知
buffer1412253 不支持156
detune441340 不支持31 不支持
loop141225 不支持156
loopEnd141225 不支持156
loopStart141225 不支持156
onended1412 未知 不支持 支持 — 44 未知
playbackRate141225 不支持156
start14 — 5712 — 7925 不支持156

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 支持18 未知26 未知14 支持
AudioBufferSourceNode() 构造函数551551 未知53 未知42 未知
buffer 支持18 未知263 未知14 支持
detune4444 未知40 未知32 未知
loop 支持18 未知26 未知14 支持
loopEnd 支持18 未知26 未知14 支持
loopStart 支持18 未知26 未知14 支持
onended 支持18 未知 未知 未知 支持 — 43 未知
playbackRate 支持18 未知26 未知14 支持
start 支持18 未知26 未知14 支持

1. 在版本 59 之前,不支持默认值。

2. 在 Samsung Internet 7.0 之前,不支持默认值。

3. Firefox 当前错误地处理了 null 值。当值为 null 时,该节点不生成一个只生成一个静默通道的节点,而是变得不可用,如果您试图将其连接到该节点,该节点将被忽略。

相关链接