AnalyserNode - 表示能够提供实时频率和时域分析信息的节点
AnalyserNode 接口表示能够提供实时频率和时域分析信息的节点。它是一个 AudioNode,它将音频流从输入不变地传递到输出,但是允许您获取生成的数据,对其进行处理并创建音频可视化。
一个 AnalyserNode 只有一个输入和一个输出。即使未连接输出,该节点也可以工作。
| 输入数量 | 1 |
|---|---|
| 输出数量 | 1 (但可能未连接) |
| 通道计数模式 | "max" |
| 通道数 | 2 |
| 通道解释 | "speakers" |
继承
该接口从以下父接口继承:
构造函数
AnalyserNode()
创建一个 AnalyserNode 对象的新实例。
属性
从其父接口 AudioNode 继承了属性。
AnalyserNode.fftSize
一个 unsigned long,表示 FFT(Fast Fourier Transform 快速傅立叶变换),大小用于确定频域。
AnalyserNode.frequencyBinCount 只读
一个 unsigned long,表示 FFT 大小一半。通常,这等于您必须为可视化处理的数据值的数量。
AnalyserNode.minDecibels
一个 double,表示 FFT 分析数据的缩放范围内的最小功率值,可转换为无符号字节值 - 基本上,这是使用 getByteFrequencyData() 时指定结果范围的最小值。
AnalyserNode.maxDecibels
一个 double,表示 FFT 分析数据的缩放范围内的最大功率值,可转换为无符号字节值 - 基本上,这是使用 getByteFrequencyData() 时指定结果范围的最大值。
AnalyserNode.smoothingTimeConstant
一个 double,表示最后一个分析帧的平均常数,基本上,它使随时间变化的值之间的过渡更加平滑。
方法
从其父接口 AudioNode 继承了方法。
AnalyserNode.getFloatFrequencyData()
将当前频率数据复制到传递到其中的 Float32Array 数组中。
AnalyserNode.getByteFrequencyData()
将当前频率数据复制到传递到其中的 Uint8Array(无符号字节数组)中。
AnalyserNode.getFloatTimeDomainData()
将当前波形或时域数据复制到传递到其中的 Float32Array 数组中。
AnalyserNode.getByteTimeDomainData()
将当前波形或时域数据复制到传递到其中的 Uint8Array(无符号字节数组)中。
实例
注意:有关创建音频可视化的更多信息,请参见指南 使用 Web 音频 API 进行可视化。
基本用法
以下实例显示了使用 AudioContext 创建一个 AnalyserNode,然后依次使用 requestAnimationFrame 和 <canvas> 以重复收集时域数据并绘制当前音频输入的 “示波器样式” 输出。有关更完整的应用实例 / 信息,请查看我们的 Voice-change-O-matic 演示(请参阅 app.js 第 128–205 行)。
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
var analyser = audioCtx.createAnalyser();
// ...
analyser.fftSize = 2048;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);
// 获取 ID 为 “oscilloscope” 的画布
var canvas = document.getElementById("oscilloscope");
var canvasCtx = canvas.getContext("2d");
// 绘制当前音频源的示波器
function draw() {
requestAnimationFrame(draw);
analyser.getByteTimeDomainData(dataArray);
canvasCtx.fillStyle = "rgb(200, 200, 200)";
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
canvasCtx.lineWidth = 2;
canvasCtx.strokeStyle = "rgb(0, 0, 0)";
canvasCtx.beginPath();
var sliceWidth = canvas.width * 1.0 / bufferLength;
var x = 0;
for (var i = 0; i < bufferLength; i++) {
var v = dataArray[i] / 128.0;
var y = v * canvas.height / 2;
if (i === 0) {
canvasCtx.moveTo(x, y);
} else {
canvasCtx.lineTo(x, y);
}
x += sliceWidth;
}
canvasCtx.lineTo(canvas.width, canvas.height / 2);
canvasCtx.stroke();
}
draw();
规范
| 规范 | 状态 | 备注 |
|---|---|---|
| Web Audio API AnalyserNode 的定义 |
工作草案 | - |
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 14 | ≤18 | 25 | 不支持 | 15 | 6 |
AnalyserNode() 构造函数 | 55 | ≤79 | 53 | 不支持 | 42 | 未知 |
fftSize | 14 | 12 | 25 | 不支持 | 15 | 6 |
frequencyBinCount | 14 | 12 | 25 | 不支持 | 15 | 6 |
getByteFrequencyData | 14 | 12 | 25 | 不支持 | 15 | 6 |
getByteTimeDomainData | 14 | 12 | 25 | 不支持 | 15 | 6 |
getFloatFrequencyData | 14 | 12 | 25 | 不支持 | 15 | 6 |
getFloatTimeDomainData | 14 | 12 | 25 | 不支持 | 15 | 不支持 |
maxDecibels | 14 | 12 | 25 | 不支持 | 15 | 6 |
minDecibels | 14 | 12 | 25 | 不支持 | 15 | 6 |
smoothingTimeConstant | 14 | 12 | 25 | 不支持 | 15 | 6 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
AnalyserNode() 构造函数 | 55 | 55 | 未知 | 53 | 未知 | 42 | 未知 |
fftSize | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
frequencyBinCount | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
getByteFrequencyData | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
getByteTimeDomainData | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
getFloatFrequencyData | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
getFloatTimeDomainData | 支持 | 18 | 未知 | 26 | 未知 | 14 | 未知 |
maxDecibels | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
minDecibels | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
smoothingTimeConstant | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |