AudioBufferSourceNode

Baseline 已广泛支持

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

AudioBufferSourceNode 接口是一个 AudioScheduledSourceNode,它表示一个由内存中的音频数据组成的音频源,这些数据存储在 AudioBuffer 中。

此接口对于播放具有极高时序精度要求的音频特别有用,例如需要与特定节奏匹配的声音,并且可以保存在内存中而不是从磁盘或网络播放。要播放需要精确时序但必须从网络流式传输或从磁盘播放的声音,请使用 AudioWorkletNode 来实现其播放。

EventTarget AudioNode AudioScheduledSourceNode AudioBufferSourceNode

AudioBufferSourceNode 没有输入,只有一个输出,其通道数与由其 buffer 属性指定的 AudioBuffer 的通道数相同。如果未设置 buffer(即 buffernull),则输出将包含一个单声道静音(所有样本均为 0)。

AudioBufferSourceNode 只能播放一次;每次调用 start() 后,如果您想再次播放相同的声音,则必须创建一个新节点。幸运的是,这些节点创建成本非常低,并且实际的 AudioBuffer 可以重复用于多次播放。实际上,您可以“即用即弃”地使用这些节点:创建节点,调用 start() 开始播放声音,甚至不必保留对其的引用。它将在适当的时候自动被垃圾回收,这将在声音播放完毕后的一段时间内才发生。

允许多次调用 stop()。如果 AudioBufferSourceNode 尚未到达 buffer 末尾,则最近一次调用将覆盖前一次调用。

The AudioBufferSourceNode takes the content of an AudioBuffer and m

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

构造函数

AudioBufferSourceNode()

创建并返回一个新的 AudioBufferSourceNode 对象。作为替代,您可以使用 BaseAudioContext.createBufferSource() 工厂方法;请参阅 创建 AudioNode

实例属性

继承自其父级 AudioScheduledSourceNode 的属性.

AudioBufferSourceNode.buffer

一个 AudioBuffer,它定义了要播放的音频资源,或者当设置为 null 值时,定义一个单声道静音(其中所有样本均为 0.0)。

AudioBufferSourceNode.detune

一个 k-rate AudioParam,表示以 音分 为单位的播放失谐。此值与 playbackRate 复合以确定声音的播放速度。其默认值为 0(表示无失谐),标称范围为 -∞ 到 ∞。

AudioBufferSourceNode.loop

一个布尔属性,指示在到达 AudioBuffer 的末尾时是否必须重播音频资源。其默认值为 false

AudioBufferSourceNode.loopStart 可选

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

AudioBufferSourceNode.loopEnd 可选

一个浮点数,表示当 looptrue 时,AudioBuffer 的播放停止并循环回到 loopStart 指定的时间,(以秒为单位)。默认值为 0

AudioBufferSourceNode.playbackRate

一个 k-rate AudioParam,它定义了音频资源播放的速度因子,其中 1.0 的值为声音的自然采样率。由于输出没有进行音高修正,因此可以用来改变样本的音高。此值与 detune 复合以确定最终的播放速率。

实例方法

继承自其父级 AudioScheduledSourceNode 的方法,并覆盖以下方法.

start()

调度 buffer 中包含的音频数据的播放,或立即开始播放。此外,还可以设置开始偏移量和播放持续时间。

示例

在此示例中,我们创建了一个两秒钟的 buffer,用白噪声填充它,然后使用 AudioBufferSourceNode 播放它。注释应该清楚地解释正在发生的事情。

注意:您还可以 实时运行代码,或 查看源代码

js
const audioCtx = new AudioContext();

// Create an empty three-second stereo buffer at the sample rate of the AudioContext
const myArrayBuffer = audioCtx.createBuffer(
  2,
  audioCtx.sampleRate * 3,
  audioCtx.sampleRate,
);

// Fill the buffer with white noise;
// just random values between -1.0 and 1.0
for (let channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // This gives us the actual ArrayBuffer that contains the data
  const nowBuffering = myArrayBuffer.getChannelData(channel);
  for (let i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() is in [0; 1.0]
    // audio needs to be in [-1.0; 1.0]
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// Get an AudioBufferSourceNode.
// This is the AudioNode to use when we want to play an AudioBuffer
const source = audioCtx.createBufferSource();
// set the buffer in the AudioBufferSourceNode
source.buffer = myArrayBuffer;
// connect the AudioBufferSourceNode to the
// destination so we can hear the sound
source.connect(audioCtx.destination);
// start the source playing
source.start();

注意:有关 decodeAudioData() 的示例,请参阅 AudioContext.decodeAudioData() 页面。

规范

规范
Web Audio API
# AudioBufferSourceNode

浏览器兼容性

另见