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 |
浏览器兼容性
加载中…