ScriptProcessorNode - 用于使用 JavaScript 生成,处理或分析音频

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

ScriptProcessorNode 接口用于使用 JavaScript 生成,处理或分析音频。

注意:自 2014 年 8 月 29 日 Web Audio API 规范发布以来,此功能已被标记为已弃用,并已由 AudioWorklet 替代(请参见 AudioWorkletNode)。

ScriptProcessorNode 接口是一个 AudioNode 音频处理模块,该模块链接到两个缓冲区,一个包含输入音频数据,一个包含处理后的输出音频数据。每当输入缓冲区包含新数据时,都会向对象发送一个实现 AudioProcessingEvent 接口的事件,并且事件处理程序在用数据填充输出缓冲区时终止该事件处理程序。

ScriptProcessorNode 将输入存储在缓冲区中,发送 audioprocess 事件。EventHandler 接受输入缓冲区并填充输出缓冲区,该缓冲区由 ScriptProcessorNode 发送到输出。

当调用 AudioContext.createScriptProcessor() 方法时,输入和输出缓冲区的大小在创建时定义(两者均由 AudioContext.createScriptProcessor()bufferSize 参数定义)。缓冲区的大小必须在 25616384 之间为 2 的幂,即 256, 512, 1024, 20484096819216384。较小的数字会降低_延迟_,但是可能需要较大的数字才能避免音频中断和毛刺。

如果未定义缓冲区大小(建议这样做),浏览器将选择其启发式认为合适的缓冲区大小。

输入数量 1
输出数量 1
通道计数模式 max
通道数 2 (在默认计数模式下不使用)
通道解释 speakers

属性

从其父接口 AudioNode 继承了属性。

ScriptProcessorNode.bufferSize 只读

返回一个表示输入和输出缓冲区大小的整数。它的值是 2 的幂,范围是 25616384

方法

没有特有的方法;从其父接口 AudioNode 继承了方法。

事件

使用 addEventListener() 或通过为此接口的 oneventname 属性分配事件监听器来监听这些事件

audioprocess

ScriptProcessorNode 的输入缓冲区准备好处理时触发。也可以通过 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);
}

规范

规范 状态 备注
Web Audio API
ScriptProcessorNode 的定义
工作草案 -

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持14 webkit 1225 不支持

22

15 webkit

6 webkit
audioprocess 事件14 webkit 1225 不支持

22

15 webkit

6 webkit
bufferSize14 webkit 1225 不支持

22

15 webkit

6 webkit
onaudioprocess14 webkit 1225 不支持

22

15 webkit

6 webkit

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持 支持 支持 未知25 未知

22

14 webkit

6 webkit
audioprocess 事件 支持 支持 未知25 未知

22

14 webkit

6 webkit
bufferSize 支持 支持 未知25 未知

22

14 webkit

6 webkit
onaudioprocess 支持 支持 未知25 未知

22

14 webkit

6 webkit

相关链接