AudioBuffer - 表示驻留在内存中的简短音频数据

AudioBuffer 接口表示驻留在内存中的简短音频数据,它是使用 AudioContext.decodeAudioData() 方法从音频文件创建,或者是使用 AudioContext.createBuffer() 从原始数据创建的。一旦将数据转换为 AudioBuffer,便可以通过将其传递到 AudioBufferSourceNode 中来播放音频。

这些类型的对象旨在容纳通常少于 45s 的较小音频片段。对于更长的声音,实现为 MediaElementAudioSourceNode 的对象更合适。该缓冲区包含以下格式的数据:标称范围在 -1+1 之间的非交织 IEEE754 32 位线性 PCM,即 32 位浮点缓冲区,每个样本在 -1.0 和 1.0 之间。如果 AudioBuffer 具有多个通道,则它们将存储在单独的缓冲区中。

构造函数

AudioBuffer()

创建并返回一个新的 AudioBuffer 对象实例。

属性

AudioBuffer.sampleRate 只读

返回一个浮点数,表示存储在缓冲区中的 PCM 数据的采样率(以每秒采样数为单位)。

AudioBuffer.length 只读

返回一个整数,该整数表示缓冲区中存储的 PCM 数据的长度(以样本帧为单位)。

AudioBuffer.duration 只读

返回一个双精度值,表示存储在缓冲区中的 PCM 数据的持续时间(以秒为单位)。

AudioBuffer.numberOfChannels 只读

返回一个整数,该整数表示由存储在缓冲区中的 PCM 数据描述的离散音频通道的数量。

方法

AudioBuffer.getChannelData()

返回一个 Float32Array,其中包含与通道关联的 PCM 数据,该数据由 channel 参数定义(0 代表第一个通道)。

AudioBuffer.copyFromChannel()

将样本从 AudioBuffer 的指定通道复制到 destination 数组。

AudioBuffer.copyToChannel()

source 数组中将样本复制到 AudioBuffer 的指定通道。

实例

以下简单实例说明如何创建 AudioBuffer 并使用随机白噪声填充它。您可以在我们的 webaudio-examples 仓库中找到完整的源代码;也可以查看该 在线运行版本。

var audioCtx = new (window.AudioContext || window.webkitAudioContext)();

// 以 AudioContext 的采样率创建一个空的三秒钟立体声缓冲区
var myArrayBuffer = audioCtx.createBuffer(2, audioCtx.sampleRate * 3, audioCtx.sampleRate);

// 用白噪声填充缓冲区;
// 只用 -1.0 到 1.0 之间的随机值
for (var channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // 这是一个给了包含数据的实际数组
  var nowBuffering = myArrayBuffer.getChannelData(channel);
  for (var i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() 默认是 [0; 1.0]
    // 音频需要在 [-1.0; 1.0] 之间
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// 获取一个 AudioBufferSourceNode。
// 这是我们要播放 AudioBuffer 时要使用的 AudioNode
var source = audioCtx.createBufferSource();

// 在 AudioBufferSourceNode 中设置缓冲区
source.buffer = myArrayBuffer;

// 将 AudioBufferSourceNode 连接到目标,以便我们可以听到声音
source.connect(audioCtx.destination);

// 开始播放源
source.start();

规范

规范 状态 备注
Web Audio API
AudioBuffer 的定义
工作草案 初始定义。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持14≤1825 不支持156
AudioBuffer() 构造函数551≤7953 不支持422 未知
copyFromChannel141325 不支持156
copyToChannel141325 不支持156
duration141225 不支持156
getChannelData141225 不支持156
length141225 不支持156
numberOfChannels141225 不支持156
sampleRate141225 不支持156

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 支持18 未知26 未知14 支持
AudioBuffer() 构造函数551551 未知53 未知422 未知
copyFromChannel 支持18 未知26 未知14 未知
copyToChannel 支持18 未知26 未知14 未知
duration 支持18 未知26 未知14 支持
getChannelData 支持18 未知26 未知14 支持
length 支持18 未知26 未知14 支持
numberOfChannels 支持18 未知26 未知14 支持
sampleRate 支持18 未知26 未知14 支持

1. 在 57 版之前一直支持 context 参数,但现在已将其删除。

2. 在版本 44 之前一直支持 context 参数,但现在已将其删除。

3. 在 Samsung Internet 7.0 之前一直支持 context 参数,但现在已将其删除。