AudioBufferSourceNode
AudioBufferSourceNode
接口是 AudioScheduledSourceNode
,它表示一个音频源,该音频源由存储在 AudioBuffer
中的内存中音频数据组成。
此接口特别适用于播放对时间精度要求特别严格的音频,例如必须与特定节奏匹配的声音,并且可以保存在内存中,而不是从磁盘或网络播放。要播放需要精确计时但必须从网络流式传输或从磁盘播放的声音,请使用 AudioWorkletNode
来实现其播放。
AudioBufferSourceNode
没有输入,只有一个输出,输出的通道数与其 buffer
属性指示的 AudioBuffer
相同。如果没有设置缓冲区——也就是说,如果 buffer
为 null
——则输出包含一个静音通道(每个样本都为 0)。
AudioBufferSourceNode
只能播放一次;在每次调用 start()
之后,如果要再次播放相同的声音,则必须创建一个新的节点。幸运的是,这些节点创建起来非常便宜,并且实际的 AudioBuffer
可以重复用于多次播放声音。实际上,您可以以“即发即忘”的方式使用这些节点:创建节点,调用 start()
开始播放声音,甚至不用费心保留对它的引用。它将在适当的时间自动被垃圾回收,这将在声音播放结束后一段时间内不会发生。
允许多次调用 stop()
。如果 AudioBufferSourceNode
尚未到达缓冲区的末尾,则最近一次调用将替换之前的调用。
输入数量 | 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
可选-
一个浮点值,指示当
loop
为true
时,AudioBuffer
的播放必须开始的时间(以秒为单位)。其默认值为0
(表示在每次循环开始时,播放都从音频缓冲区的开头开始)。 AudioBufferSourceNode.loopEnd
可选-
一个浮点数,指示
AudioBuffer
的播放停止并循环回loopStart
指示的时间(以秒为单位),如果loop
为true
。默认值为0
。 AudioBufferSourceNode.playbackRate
-
一个 k 速率
AudioParam
,它定义音频资产将播放的速度因子,其中 1.0 值为声音的自然采样率。由于输出上不应用音调校正,因此这可以用来改变样本的音调。此值与detune
复合以确定最终的播放速率。
实例方法
继承自其父级 AudioScheduledSourceNode
的方法,并覆盖以下方法.
start()
-
安排缓冲区中包含的音频数据的播放,或立即开始播放。此外,还允许设置开始偏移量和播放时长。
示例
在此示例中,我们创建一个两秒钟的缓冲区,用白噪声填充它,然后使用 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 |
浏览器兼容性
BCD 表仅在浏览器中加载