OfflineAudioContext

Baseline 廣泛可用 *

此特性已得到良好支援,可在多種裝置和瀏覽器版本上使用。自 2021 年 4 月起,所有瀏覽器均已支援此特性。

* 此特性的某些部分可能存在不同級別的支援。

OfflineAudioContext 介面是一個 AudioContext 介面,它代表一個由連結在一起的 AudioNode 構建的音訊處理圖。與標準的 AudioContext 不同,OfflineAudioContext 不會將音訊渲染到裝置硬體;相反,它會盡快生成音訊,並將結果輸出到 AudioBuffer

EventTarget BaseAudioContext OfflineAudioContext

建構函式

OfflineAudioContext()

建立一個新的 OfflineAudioContext 例項。

例項屬性

還繼承了其父介面 BaseAudioContext 的屬性。

OfflineAudioContext.length 只讀

一個整數,表示緩衝區中樣本幀的大小。

例項方法

還繼承了其父介面 BaseAudioContext 的方法。

OfflineAudioContext.suspend()

在指定的將來時間點排程暫停音訊上下文中的時間程序,並返回一個 Promise。

OfflineAudioContext.startRendering()

開始渲染音訊,考慮當前的連線和當前計劃的更改。本頁面同時涵蓋基於事件的版本和基於 Promise 的版本。

已廢棄的方法

OfflineAudioContext.resume()

恢復先前已暫停音訊上下文中時間的程序。

注意: resume() 方法仍然可用——它現在定義在 BaseAudioContext 介面上(請參閱 AudioContext.resume),因此 AudioContextOfflineAudioContext 介面都可以訪問它。

事件

使用 addEventListener() 或透過將事件監聽器分配給此介面的 oneventname 屬性來監聽這些事件。

完成

當離線音訊上下文的渲染完成時觸發。

示例

使用離線音訊上下文播放音訊

在此示例中,我們聲明瞭 AudioContextOfflineAudioContext 物件。我們使用 AudioContext fetch() 來載入一個音訊軌道,然後使用 OfflineAudioContext 將音訊渲染到 AudioBufferSourceNode 中並播放該軌道。在設定好離線音訊圖後,我們使用 OfflineAudioContext.startRendering() 將其渲染到 AudioBuffer

startRendering() 的 Promise 解析時,渲染就已完成,並且輸出的 AudioBuffer 會從 Promise 中返回。

此時,我們建立另一個音訊上下文,在其內部建立一個 AudioBufferSourceNode,並將其緩衝區設定為等於 Promise 返回的 AudioBuffer。然後,它作為簡單標準音頻圖的一部分進行播放。

注意: 您可以 即時執行完整示例,或 檢視原始碼

js
// Define both online and offline audio contexts
let audioCtx; // Must be initialized after a user interaction
const offlineCtx = new OfflineAudioContext(2, 44100 * 40, 44100);

// Define constants for dom nodes
const play = document.querySelector("#play");

function getData() {
  // Fetch an audio track, decode it and stick it in a buffer.
  // Then we put the buffer into the source and can play it.
  fetch("viper.ogg")
    .then((response) => response.arrayBuffer())
    .then((downloadedBuffer) => audioCtx.decodeAudioData(downloadedBuffer))
    .then((decodedBuffer) => {
      console.log("File downloaded successfully.");
      const source = new AudioBufferSourceNode(offlineCtx, {
        buffer: decodedBuffer,
      });
      source.connect(offlineCtx.destination);
      return source.start();
    })
    .then(() => offlineCtx.startRendering())
    .then((renderedBuffer) => {
      console.log("Rendering completed successfully.");
      play.disabled = false;
      const song = new AudioBufferSourceNode(audioCtx, {
        buffer: renderedBuffer,
      });
      song.connect(audioCtx.destination);

      // Start the song
      song.start();
    })
    .catch((err) => {
      console.error(`Error encountered: ${err}`);
    });
}

// Activate the play button
play.onclick = () => {
  play.disabled = true;
  // We can initialize the context as the user clicked.
  audioCtx = new AudioContext();

  // Fetch the data and start the song
  getData();
};

規範

規範
Web Audio API
# OfflineAudioContext

瀏覽器相容性

另見