BaseAudioContext: decodeAudioData() 方法
基线 广泛可用
此功能已非常成熟,可在许多设备和浏览器版本上运行。它自 2021 年 4 月.
报告反馈
BaseAudioContext 接口的 decodeAudioData() 方法用于异步解码从 fetch()、XMLHttpRequest 或 FileReader 加载的 ArrayBuffer 中包含的音频文件数据。解码后的 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)
js
参数-
arrayBuffer
- 包含要解码的音频数据的 ArrayBuffer,通常从
fetch()、XMLHttpRequest或FileReader获取。 - 解码成功完成时要调用的回调函数。此回调函数的单个参数是表示 decodedData(解码后的 PCM 音频数据)的
AudioBuffer。通常,您需要将解码后的数据放入AudioBufferSourceNode中,然后可以根据需要播放和操作它。
可选的错误回调函数,在解码音频数据时发生错误时调用。
返回值
示例
一个 Promise 对象,该对象使用 decodedData 完成。如果您使用的是 XHR 语法,则将忽略此返回值,而是使用回调函数。
在本节中,我们将首先介绍基于 Promise 的语法,然后介绍回调语法。
基于 Promise 的语法
在此示例中,loadAudio() 使用 fetch() 检索音频文件并将其解码为 AudioBuffer。然后,它将 audioBuffer 缓存到全局 buffer 变量中,以便稍后播放。
此函数实现两种异步返回音频数据或错误消息的替代方法:它返回一个
Promise 对象,该对象使用音频数据完成,并且还接受回调参数来处理成功或失败。与该函数交互的主要方法是通过其 Promise 返回值,而回调参数是出于向后兼容的原因提供的。
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。在回调函数中,它会播放解码后的缓冲区。
此函数实现两种异步返回音频数据或错误消息的替代方法:它返回一个
Promise 对象,该对象使用音频数据完成,并且还接受回调参数来处理成功或失败。与该函数交互的主要方法是通过其 Promise 返回值,而回调参数是出于向后兼容的原因提供的。
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