AudioBufferSourceNode - 表示存储在 AudioBuffer 中由内存中音频数据组成的音频源
AudioBufferSourceNode
接口是一个 AudioScheduledSourceNode
,它表示存储在 AudioBuffer
中由内存中音频数据组成的音频源。它对于回放对定时精度要求特别严格的音频,例如对于必须符合特定节奏并且可以保留在内存中而不是从磁盘或网络中播放的声音,它特别有用。要播放需要精确定时但必须从网络传输或从磁盘播放的声音,请使用 AudioWorkletNode
来实现其播放。
AudioBufferSourceNode
没有输入,只有一个输出,其通道数与其 buffer
属性所指示的 AudioBuffer
相同。如果没有设置缓冲区(即,如果 buffer
为 null
),则输出包含单个静默通道(每个样本均为 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
可选
一个浮点值,表示 loop
为 true
时必须开始播放 AudioBuffer
的时间(以秒为单位)。它的默认值为 0
(表示在每个循环的开始,从音频缓冲区的开始开始播放)。
AudioBufferSourceNode.loopEnd
可选
一个浮点数,指示 AudioBuffer
的播放停止的时间(以秒为单位),如果 loop
为 true
,则循环返回由 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 的定义 |
工作草案 | - |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 14 | ≤18 | 25 | 不支持 | 15 | 6 |
AudioBufferSourceNode() 构造函数 | 551 | ≤79 | 53 | 不支持 | 42 | 未知 |
buffer | 14 | 12 | 253 | 不支持 | 15 | 6 |
detune | 44 | 13 | 40 | 不支持 | 31 | 不支持 |
loop | 14 | 12 | 25 | 不支持 | 15 | 6 |
loopEnd | 14 | 12 | 25 | 不支持 | 15 | 6 |
loopStart | 14 | 12 | 25 | 不支持 | 15 | 6 |
onended | 14 | 12 | 未知 | 不支持 | 支持 — 44 | 未知 |
playbackRate | 14 | 12 | 25 | 不支持 | 15 | 6 |
start | 14 — 57 | 12 — 79 | 25 | 不支持 | 15 | 6 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
AudioBufferSourceNode() 构造函数 | 551 | 551 | 未知 | 53 | 未知 | 42 | 未知 |
buffer | 支持 | 18 | 未知 | 263 | 未知 | 14 | 支持 |
detune | 44 | 44 | 未知 | 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
时,该节点不生成一个只生成一个静默通道的节点,而是变得不可用,如果您试图将其连接到该节点,该节点将被忽略。