BaseAudioContext: decodeAudioData() 方法

基线 广泛可用

此功能已非常成熟,可在许多设备和浏览器版本上运行。它自 2021 年 4 月.

报告反馈

BaseAudioContext 接口的 decodeAudioData() 方法用于异步解码从 fetch()XMLHttpRequestFileReader 加载的 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()XMLHttpRequestFileReader 获取。

successCallback 可选

解码成功完成时要调用的回调函数。此回调函数的单个参数是表示 decodedData(解码后的 PCM 音频数据)的 AudioBuffer。通常,您需要将解码后的数据放入 AudioBufferSourceNode 中,然后可以根据需要播放和操作它。

errorCallback 可选

可选的错误回调函数,在解码音频数据时发生错误时调用。

返回值

示例

一个 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

另请参阅