AudioBufferSourceNode
AudioBufferSourceNode 接口是一个 AudioScheduledSourceNode,它表示一个由内存中的音频数据组成的音频源,这些数据存储在 AudioBuffer 中。
此接口对于播放具有极高时序精度要求的音频特别有用,例如需要与特定节奏匹配的声音,并且可以保存在内存中而不是从磁盘或网络播放。要播放需要精确时序但必须从网络流式传输或从磁盘播放的声音,请使用 AudioWorkletNode 来实现其播放。
AudioBufferSourceNode 没有输入,只有一个输出,其通道数与由其 buffer 属性指定的 AudioBuffer 的通道数相同。如果未设置 buffer(即 buffer 为 null),则输出将包含一个单声道静音(所有样本均为 0)。
AudioBufferSourceNode 只能播放一次;每次调用 start() 后,如果您想再次播放相同的声音,则必须创建一个新节点。幸运的是,这些节点创建成本非常低,并且实际的 AudioBuffer 可以重复用于多次播放。实际上,您可以“即用即弃”地使用这些节点:创建节点,调用 start() 开始播放声音,甚至不必保留对其的引用。它将在适当的时候自动被垃圾回收,这将在声音播放完毕后的一段时间内才发生。
允许多次调用 stop()。如果 AudioBufferSourceNode 尚未到达 buffer 末尾,则最近一次调用将覆盖前一次调用。

| 输入数量 | 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可选-
一个浮点值,表示当
loop为true时,AudioBuffer的播放必须开始的时间(以秒为单位)。其默认值为0(表示在每次循环开始时,播放从音频 buffer 的开头开始)。 AudioBufferSourceNode.loopEnd可选-
一个浮点数,表示当
loop为true时,AudioBuffer的播放停止并循环回到loopStart指定的时间,(以秒为单位)。默认值为0。 AudioBufferSourceNode.playbackRate-
一个 k-rate
AudioParam,它定义了音频资源播放的速度因子,其中 1.0 的值为声音的自然采样率。由于输出没有进行音高修正,因此可以用来改变样本的音高。此值与detune复合以确定最终的播放速率。
实例方法
继承自其父级 AudioScheduledSourceNode 的方法,并覆盖以下方法.
start()-
调度 buffer 中包含的音频数据的播放,或立即开始播放。此外,还可以设置开始偏移量和播放持续时间。
示例
在此示例中,我们创建了一个两秒钟的 buffer,用白噪声填充它,然后使用 AudioBufferSourceNode 播放它。注释应该清楚地解释正在发生的事情。
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 |
浏览器兼容性
加载中…