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 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 14 | ≤18 | 25 | 不支持 | 15 | 6 |
AudioBuffer() 构造函数 | 551 | ≤79 | 53 | 不支持 | 422 | 未知 |
copyFromChannel | 14 | 13 | 25 | 不支持 | 15 | 6 |
copyToChannel | 14 | 13 | 25 | 不支持 | 15 | 6 |
duration | 14 | 12 | 25 | 不支持 | 15 | 6 |
getChannelData | 14 | 12 | 25 | 不支持 | 15 | 6 |
length | 14 | 12 | 25 | 不支持 | 15 | 6 |
numberOfChannels | 14 | 12 | 25 | 不支持 | 15 | 6 |
sampleRate | 14 | 12 | 25 | 不支持 | 15 | 6 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
AudioBuffer() 构造函数 | 551 | 551 | 未知 | 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
参数,但现在已将其删除。