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

浏览器兼容性

另见