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 | 支持 |