AudioProcessingEvent - 表示在已准备好处理的 ScriptProcessorNode 输入缓冲区时发生的事件
已废弃
该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。
AudioProcessingEvent 是 Web Audio API 的接口,表示在已准备好处理的 ScriptProcessorNode 输入缓冲区时发生的事件。
注意:截至 2014 年 8 月 29 日发布的 Web Audio API 规范中,此功能已被标记为已弃用,很快将被 AudioWorklet 替换。
属性
下面的列表包括了从其父级继承的属性 Event 。
target 只读
一个 EventTarget,表示事件目标(DOM 树中最顶部的目标)。
type 只读
一个 DOMString ,表示事件类型。
bubbles 只读
一个 boolean,表示事件是否正常冒泡?
cancelable 只读
一个 boolean,表示是否有可能取消该事件?
playbackTime 只读
一个 double,表示音频将被播放的时间,如 AudioContext.currentTime 所定义的内容。
inputBuffer 只读
一个 AudioBuffer,表示缓冲区包含要处理的输入音频数据。频道的数量被定义为工厂方法 AudioContext.createScriptProcessor() 的 numberOfInputChannels 参数。注意返回的 AudioBuffer 仅在 onaudioprocess 函数的范围内有效。
outputBuffer 只读
一个 AudioBuffer,表示应该写入输出音频数据的缓冲区。频道的数量被定义为工厂方法 AudioContext.createScriptProcessor() 的 numberOfOutputChannels 参数。注意返回的 AudioBuffer 仅在 onaudioprocess 功能的范围内有效。
实例
以下实例显示了 ScriptProcessorNode 的基本用法,即获取通过 AudioContext.decodeAudioData() 加载的音轨,对其进行处理,并对输入音轨(缓冲区)的每个音频样本添加一点白噪声,并通过 AudioDestinationNode 播放它。对于每个通道和每个样本帧 scriptNode.onaudioprocess 函数获取相关的 audioProcessingEvent,并使用它循环通过输入缓冲区的每个通道和每个通道中的每个样本,并添加少量白噪声,然后将结果设置为每种情况下的输出样本。
注意:有关完整的工作实例,请参见我们的 script-processor-node github 存储库(另请查看源代码。
var myScript = document.querySelector('script');
var myPre = document.querySelector('pre');
var playButton = document.querySelector('button');
// 创建 AudioContext 和缓冲源
var audioCtx = new AudioContext();
source = audioCtx.createBufferSource();
// 创建一个 ScriptProcessorNode,其 bufferSize 为 4096,并具有单个输入和输出通道
var scriptNode = audioCtx.createScriptProcessor(4096, 1, 1);
console.log(scriptNode.bufferSize);
// 通过 XHR 和 decodeAudioData 加载音轨
function getData() {
request = new XMLHttpRequest();
request.open('GET', 'viper.ogg', true);
request.responseType = 'arraybuffer';
request.onload = function() {
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
myBuffer = buffer;
source.buffer = myBuffer;
},
function(e){"解码音频数据时出错" + e.err});
}
request.send();
}
// 为节点提供处理音频事件的功能
scriptNode.onaudioprocess = function(audioProcessingEvent) {
// 输入缓冲区是我们之前加载的歌曲
var inputBuffer = audioProcessingEvent.inputBuffer;
// 输出缓冲区包含将被修改和播放的样本
var outputBuffer = audioProcessingEvent.outputBuffer;
// 循环通过输出通道(在这种情况下,只有一个)
for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
// 循环访问 4096 个样本
for (var sample = 0; sample < inputBuffer.length; sample++) {
// 使输出等于输入
outputData[sample] = inputData[sample];
// 给每个输出样本增加噪声
outputData[sample] += ((Math.random() * 2) - 1) * 0.2;
}
}
}
getData();
// 连线播放按钮
playButton.onclick = function() {
source.connect(scriptNode);
scriptNode.connect(audioCtx.destination);
source.start();
}
// 当缓冲源停止播放时,断开所有连接
source.onended = function() {
source.disconnect(scriptNode);
scriptNode.disconnect(audioCtx.destination);
}
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 14 | 12 | 25 | 不支持 | 15 | 6 |
AudioProcessingEvent() 构造函数 | 57 | 79 | 不支持 | 不支持 | 44 | 不支持 |
inputBuffer | 14 | 12 | 25 | 不支持 | 15 | 6 |
outputBuffer | 14 | 12 | 25 | 不支持 | 15 | 6 |
playbackTime | 14 | 12 | 25 | 不支持 | 15 | 6 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
AudioProcessingEvent() 构造函数 | 57 | 57 | 未知 | 不支持 | 未知 | 43 | 不支持 |
inputBuffer | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
outputBuffer | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |
playbackTime | 支持 | 18 | 未知 | 26 | 未知 | 14 | 支持 |