Javascript AudioWorklet程序中的bufferSize会产生刺耳的声音

Javascript AudioWorklet程序中的bufferSize会产生刺耳的声音,javascript,web-audio-api,scriptprocessor,audio-worklet,worklet,Javascript,Web Audio Api,Scriptprocessor,Audio Worklet,Worklet,我的程序正在使用AudioWorklet重新创建ScriptProcessorNode。不幸的是,我没有服务器来测试它,但多亏了,我成功地让它运行起来。无论如何,这个想法的目标是通过使用新替换的功能AudioWorklet,重新创建与原始ScriptProcessorNode类似的功能(因为它现在已被弃用) 代码如下: scriptProcessingWorklet.js class ScriptProcessingHandler扩展了AudioWorkletProcessor{ 构造函数(选项

我的程序正在使用
AudioWorklet
重新创建
ScriptProcessorNode
。不幸的是,我没有服务器来测试它,但多亏了,我成功地让它运行起来。无论如何,这个想法的目标是通过使用新替换的功能
AudioWorklet
,重新创建与原始
ScriptProcessorNode
类似的功能(因为它现在已被弃用)

代码如下:

scriptProcessingWorklet.js

class ScriptProcessingHandler扩展了AudioWorkletProcessor{
构造函数(选项){
超级();
这是。_frameSize=128;
这。_bufferSize=options.processorOptions.bufferSize;
//此.\u frameCount表示一个数字,指示需要添加多少128个样本帧
//匹配缓冲区大小,因为在https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode 
//都可以被128整除
this.\u frameCount=this.\u bufferSize/this.\u frameSize;
//用于存储音频数据帧的阵列
这是._inputData=[];
这是._outputData=[];
this.port.onmessage=this.\u processMessage.bind(this);
}
_processMessage(e){
开关(如数据信息){
案例“过程输出”:
此._处理输出(例如数据细节);
打破
}
}
_sendMessage(消息,详细信息=null){
如果(!消息){
返回;
}
this.port.postMessage({message,detail});
}
_sendInputData(帧){
var numChannels=0,len=0,f=0;
对于(f=0;f=this.\u frameCount){
//然后将它们从数组中提取出来,并将每一帧处理为一帧
var extract=this.\u inputData.splice(0,this.\u frameCount);
这是.\u发送输入数据(提取);
}
//将音频数据从输入添加到阵列
这个._inputData.push(数据);
}
_processOutput(数据){
//将音频数据转换回多个128采样帧
var temp=新数组(data.numberOfChannels).fill(新Float32Array(this.\u frameSize));
var frames=新数组(data.numberOfFrames).fill(temp);
对于(var f=0;f0){
var输出=输出[0];
var outData=this._outputData.shift();
对于(var c=0;c
ScriptProcessorNodePollyfill.js

(函数(根){
“严格使用”;
if(AudioWorkletNode的类型==“未定义”){
返回;
}
//常数
常量缓冲区大小=[128、256、512、1024、2048、4096、8192、16384];
常量默认值={
缓冲区大小:2048,
输入通道数:2,
输出通道数:2,
}
//利用
常量util={
isNumber:函数(x){
返回类型x==“number”&&isFinite(x);
},
断言:函数(bool,msg){
如果(!bool){
抛出新错误(msg);
}
},
isValidBufferSize:函数(大小){
assert(util.isNumber(size),“ScriptProcessorNodePoylyfill.buffeSize不是一个数字”);
var索引=缓冲区大小。indexOf(大小);
assert(索引!=-1,“ScriptProcessorNodePolyfill.bufferSize不是有效的缓冲区大小”);
},
IsValidChannel:函数(n,t){
assert(util.isNumber(n),“ScriptProcessorNodePolyfill.numberOf”+t+“通道不是数字”);
断言(n>0,“ScriptProcessorNodePolyfill.numberOf”+t+“通道必须至少为1个或多个通道”);
}
}
//不要担心代码中的事件部分
//音频处理事件定义
//定义于https://webaudio.github.io/web-audio-api/#audioproccessingevent
类AudioProcessingEventPolyfill扩展事件{
构造函数(类型,init){
超级(型);
this.inputBuffer=init.inputBuffer;
this.outputBuffer=init.outputBuffer;
this.playbackTime=init.playbackTime;
}
}
//主利比亚
类ScriptProcessorNodePolyfill/*扩展了EventTarget*/{
构造函数(上下文,可选)