怎么实现 createScriptProcessor 到 AudioWorkletNode和AudioWorkletProcessor的过渡

zhtoad 2021-05-11 12:16:44
各位,以前的项目用的 createScriptProcessor 来处理音频。
但是现在发现这个方法被禁用了。网页有提醒的。
转成
AudioWorkletProcessor AudioWorkletNode
以前的 createScriptProcessor 有事件。得到数据后,立马存取来。可以直接处理。
现在的 AudioWorkletProcessor。 只有一个process,没有事件。
请问,我怎么把里面的样点数据导出来,用到以前的框架下。
以前的好理解:主线程里面注册事件就可以了。
recorder.onaudioprocess = function (e) {
save(e.inputBuffer.getChannelData(0));
};
但是, AudioWorkletProcessor里面。只有一个process,有人弄出来数据吗? 谢谢。
process(inputs, outputs, parameters) {
const input = inputs[0];
const output = outputs[0];
const gain = parameters.gain;

for (let channel = 0; channel < input.length; ++channel) {
const inputChannel = input[channel];
const outputChannel = output[channel];
if (gain.length === 1) {
for (let i = 0; i < inputChannel.length; ++i){
outputChannel[i] = inputChannel[i] * gain[0];
//this.cb(inputChannel[i]);
window.recorder.audioData.input(inputChannel[i]);
}
} else {
for (let i = 0; i < inputChannel.length; ++i)
outputChannel[i] = inputChannel[i] * gain[i];
}
}

return true;
}
...全文
1811 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
JQH_-_ 2022-01-04
  • 打赏
  • 举报
回复
class VoiceDataGet extends AudioWorkletProcessor {
    /*
    * options由new AudioWorkletNode()时传递
    * */
    constructor() {
        super();
    }

    /*
    * `inputList`和outputList`都是输入或输出的数组
    * 比较坑的是只有128个样本???如何设置
    * */
    process (inputList, outputList, parameters) {
      // console.log(inputList)
      if(inputList.length>0&&inputList[0].length>0){
        this.port.postMessage(inputList[0]);
      }
      return true;//回来让系统知道我们仍处于活动状态并准备处理音频。
    }
}
registerProcessor('voice-data-get', VoiceDataGet)
/*初始化AudioContext、AudioWorkletNode*/
      async initData() {
        try {
          let audioContext = new AudioContext();
          /*音频流数据分析节点*/
          let audioWorkletNode;
          try {
            audioWorkletNode = new AudioWorkletNode(audioContext, "voice-data-get");
          } catch (e) {
            try {
              /*---------------加载AudioWorkletProcessor模块并将其添加到当前的Worklet----------------------------*/
              await audioContext.audioWorklet.addModule('./js/voice-data-get.js');
              /*---------------AudioWorkletNode绑定加载后的AudioWorkletProcessor---------------------------------*/
              audioWorkletNode = new AudioWorkletNode(audioContext, "voice-data-get");
            } catch (error) {
              console.log(error);
            }
          }
          {
            /*-------------AudioWorkletNode和AudioWorkletProcessor通信使用MessagePort--------------------------*/
            let inputData=[];
            const messagePort = audioWorkletNode.port;
            messagePort.onmessage = (e) => {
              let channelData = e.data[0];
              inputData.push(...channelData);
            }
          }//音频流数据分析
          return audioWorkletNode;
        } catch (e) {
          console.log(e)
        }
      }

87,995

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧