BaseAudioContext: decodeAudioData() 方法
BaseAudioContext 介面的 decodeAudioData() 方法用於非同步解碼 ArrayBuffer 中包含的音訊檔案資料,該資料通常從 fetch()、XMLHttpRequest 或 FileReader 載入。解碼後的 AudioBuffer 會被重取樣到 AudioContext 的取樣率,然後傳遞給回撥函式或 Promise。
這是從音訊軌道建立 Web Audio API 音訊源的首選方法。此方法僅適用於完整的音訊檔案資料,而不適用於音訊檔案資料的片段。
此函式實現了兩種非同步返回音訊資料或錯誤訊息的方式:它返回一個解析為音訊資料的 Promise,並接受回撥引數來處理成功或失敗。與此函式互動的主要方式是透過其 Promise 返回值,而回調引數是為相容舊版本而提供的。
語法
// Promise-based syntax returns a Promise:
decodeAudioData(arrayBuffer)
// Callback syntax has no return value:
decodeAudioData(arrayBuffer, successCallback)
decodeAudioData(arrayBuffer, successCallback, errorCallback)
引數
arrayBuffer-
一個包含要解碼的音訊資料的 ArrayBuffer,通常透過
fetch()、XMLHttpRequest或FileReader獲取。 successCallback可選-
一個回撥函式,在解碼成功完成時呼叫。此回撥函式的單個引數是一個
AudioBuffer,代表decodedData(解碼後的 PCM 音訊資料)。通常,您會想將解碼後的資料放入一個AudioBufferSourceNode中,然後就可以根據需要播放和操作它了。 errorCallback可選-
一個可選的錯誤回撥,在解碼音訊資料時發生錯誤時呼叫。
返回值
一個 Promise 物件,解析為decodedData。如果您使用的是 XHR 語法,則會忽略此返回值,而改用回撥函式。
示例
在本節中,我們將首先介紹基於 Promise 的語法,然後介紹回撥語法。
基於 Promise 的語法
在此示例中,loadAudio() 使用 fetch() 來檢索音訊檔案,並將其解碼為 AudioBuffer。然後,它將 audioBuffer 快取到全域性 buffer 變數中,以便稍後播放。
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。在回撥函式中,它會播放解碼後的緩衝區。
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 |
瀏覽器相容性
載入中…