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 |
瀏覽器相容性
載入中…