AudioProcessingEvent - 表示在已准备好处理的 ScriptProcessorNode 输入缓冲区时发生的事件

已废弃
该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

AudioProcessingEventWeb 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);
}

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持141225 不支持156
AudioProcessingEvent() 构造函数5779 不支持 不支持44 不支持
inputBuffer141225 不支持156
outputBuffer141225 不支持156
playbackTime141225 不支持156

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 支持18 未知26 未知14 支持
AudioProcessingEvent() 构造函数5757 未知 不支持 未知43 不支持
inputBuffer 支持18 未知26 未知14 支持
outputBuffer 支持18 未知26 未知14 支持
playbackTime 支持18 未知26 未知14 支持

相关链接