AudioBufferSourceNode

基线 广泛可用

此功能已得到良好建立,并且可在许多设备和浏览器版本上运行。它自以下时间起在浏览器中可用: 2021 年 4 月.

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

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

EventTarget AudioNode AudioScheduledSourceNode AudioBufferSourceNode

AudioBufferSourceNode 没有输入,只有一个输出,输出的通道数与其 buffer 属性指示的 AudioBuffer 相同。如果没有设置缓冲区——也就是说,如果 buffernull——则输出包含一个静音通道(每个样本都为 0)。

AudioBufferSourceNode 只能播放一次;在每次调用 start() 之后,如果要再次播放相同的声音,则必须创建一个新的节点。幸运的是,这些节点创建起来非常便宜,并且实际的 AudioBuffer 可以重复用于多次播放声音。实际上,您可以以“即发即忘”的方式使用这些节点:创建节点,调用 start() 开始播放声音,甚至不用费心保留对它的引用。它将在适当的时间自动被垃圾回收,这将在声音播放结束后一段时间内不会发生。

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

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 速率 AudioParam,表示以 音分 为单位的播放音调偏移。此值与 playbackRate 复合以确定声音播放的速度。其默认值为 0(表示没有音调偏移),其标称范围为 -∞ 到 ∞。

AudioBufferSourceNode.loop

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

AudioBufferSourceNode.loopStart 可选

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

AudioBufferSourceNode.loopEnd 可选

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

AudioBufferSourceNode.playbackRate

一个 k 速率 AudioParam,它定义音频资产将播放的速度因子,其中 1.0 值为声音的自然采样率。由于输出上不应用音调校正,因此这可以用来改变样本的音调。此值与 detune 复合以确定最终的播放速率。

实例方法

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

start()

安排缓冲区中包含的音频数据的播放,或立即开始播放。此外,还允许设置开始偏移量和播放时长。

示例

在此示例中,我们创建一个两秒钟的缓冲区,用白噪声填充它,然后使用 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

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅