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

瀏覽器相容性

另見