ScriptProcessorNode 已被废弃,因主线程阻塞、调度不可靠、性能差且被W3C移出规范;现代标准替代方案是AudioWorklet,支持采样级处理、参数自动化和多通道运算。

ScriptProcessorNode 已被废弃,不建议在新项目中使用。 它在现代浏览器中已被 AudioWorklet 取代,且 Chrome 从 64 版本起完全移除支持,Firefox 也早已弃用。若你看到旧教程或代码中使用它,需尽快迁移。
为什么 ScriptProcessorNode 被淘汰
主要问题包括:
- 主线程阻塞:音频处理在 JS 主线程执行,易导致卡顿和定时不准;
- 调度不可靠:回调触发时机不精确,无法满足低延迟音频需求;
- 性能差:频繁的 JS 函数调用与内存拷贝开销大;
- 标准组织(W3C)明确将其标记为 deprecated,并从规范中移除。
替代方案:用 AudioWorklet 实现采样点处理
这是当前标准、高性能、主线程无干扰的方案。基础步骤如下:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
编写 AudioWorkletProcessor(如
gain-processor.js):
<!-- gain-processor.js -->class GainProcessor extends AudioWorkletProcessor {<br> static get parameterDescriptors() {<br> return [{ name: 'gain', defaultValue: 1.0 }];<br> }<br><br> process(inputs, outputs, parameters) {<br> const input = inputs[0];<br> const output = outputs[0];<br> const gain = parameters.gain;<br><br> for (let channel = 0; channel < output.length; channel++) {<br> const inputChannel = input[channel] || new Float32Array(output[channel].length);<br> const outputChannel = output[channel];<br> for (let i = 0; i < outputChannel.length; i++) {<br> outputChannel[i] = inputChannel[i] * gain[i % gain.length]; // 支持随时间变化的 gain<br> }<br> }<br> return true;<br> }<br>}<br><br>registerProcessor('gain-processor', GainProcessor); -
在主脚本中加载并使用:
const audioContext = new (window.AudioContext || window.webkitAudioContext)();<br>await audioContext.audioWorklet.addModule('gain-processor.js');<br><br>const gainNode = new AudioWorkletNode(audioContext, 'gain-processor', {<br> processorOptions: { gain: 0.5 }<br>});<br><br>// 接入音频源(如 OscillatorNode 或 AudioBufferSourceNode)<br>const osc = audioContext.createOscillator();<br>osc.connect(gainNode);<br>gainNode.connect(audioContext.destination);<br>osc.start();
如果必须兼容极老环境(仅作了解)
仅限调试或阅读遗留代码,不要用于生产:
立即学习“前端免费学习笔记(深入)”;
- 创建方式:
const scriptNode = audioContext.createScriptProcessor(4096, 1, 1);(缓冲区大小、输入/输出通道数); - 监听
onaudioprocess事件,在回调中遍历event.outputBuffer.getChannelData(0)修改采样点; - 注意:该节点不参与 Web Audio 的自动调度,需手动填充输出缓冲区,且输入缓冲区可能为空(需判空);
- 无法动态修改参数(如增益),只能通过闭包或全局变量传参,线程不安全。
AudioWorklet 是唯一推荐路径。它支持实时采样级运算、参数自动化、多通道处理,并与 Web Audio 图形无缝集成。迁移成本看似略高,但长期可维护性和性能优势巨大。


















