BaseAudioContext: decodeAudioData() 方法

Baseline 已廣泛支援

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

BaseAudioContext 介面的 decodeAudioData() 方法用於非同步解碼 ArrayBuffer 中包含的音訊檔案資料,該資料通常從 fetch()XMLHttpRequestFileReader 載入。解碼後的 AudioBuffer 會被重取樣到 AudioContext 的取樣率,然後傳遞給回撥函式或 Promise。

這是從音訊軌道建立 Web Audio API 音訊源的首選方法。此方法僅適用於完整的音訊檔案資料,而不適用於音訊檔案資料的片段。

此函式實現了兩種非同步返回音訊資料或錯誤訊息的方式:它返回一個解析為音訊資料的 Promise,並接受回撥引數來處理成功或失敗。與此函式互動的主要方式是透過其 Promise 返回值,而回調引數是為相容舊版本而提供的。

語法

js
// Promise-based syntax returns a Promise:
decodeAudioData(arrayBuffer)

// Callback syntax has no return value:
decodeAudioData(arrayBuffer, successCallback)
decodeAudioData(arrayBuffer, successCallback, errorCallback)

引數

arrayBuffer

一個包含要解碼的音訊資料的 ArrayBuffer,通常透過 fetch()XMLHttpRequestFileReader 獲取。

successCallback 可選

一個回撥函式,在解碼成功完成時呼叫。此回撥函式的單個引數是一個 AudioBuffer,代表decodedData(解碼後的 PCM 音訊資料)。通常,您會想將解碼後的資料放入一個 AudioBufferSourceNode 中,然後就可以根據需要播放和操作它了。

errorCallback 可選

一個可選的錯誤回撥,在解碼音訊資料時發生錯誤時呼叫。

返回值

一個 Promise 物件,解析為decodedData。如果您使用的是 XHR 語法,則會忽略此返回值,而改用回撥函式。

示例

在本節中,我們將首先介紹基於 Promise 的語法,然後介紹回撥語法。

基於 Promise 的語法

在此示例中,loadAudio() 使用 fetch() 來檢索音訊檔案,並將其解碼為 AudioBuffer。然後,它將 audioBuffer 快取到全域性 buffer 變數中,以便稍後播放。

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

js
let audioCtx;
let buffer;
let source;

async function loadAudio() {
  try {
    // Load an audio file
    const response = await fetch("viper.mp3");
    // Decode it
    buffer = await audioCtx.decodeAudioData(await response.arrayBuffer());
  } catch (err) {
    console.error(`Unable to fetch the audio file. Error: ${err.message}`);
  }
}

回撥語法

在此示例中,loadAudio() 使用 fetch() 來檢索音訊檔案,並使用 decodeAudioData() 的基於回撥的版本將其解碼為 AudioBuffer。在回撥函式中,它會播放解碼後的緩衝區。

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

js
let audioCtx;
let source;

function playBuffer(buffer) {
  source = audioCtx.createBufferSource();
  source.buffer = buffer;
  source.connect(audioCtx.destination);
  source.loop = true;
  source.start();
}

async function loadAudio() {
  try {
    // Load an audio file
    const response = await fetch("viper.mp3");
    // Decode it
    audioCtx.decodeAudioData(await response.arrayBuffer(), playBuffer);
  } catch (err) {
    console.error(`Unable to fetch the audio file. Error: ${err.message}`);
  }
}

規範

規範
Web Audio API
# dom-baseaudiocontext-decodeaudiodata

瀏覽器相容性

另見