问题描述
我创建了一个 AudioWorkletProcessor 并像这样激活它:
audioCtx = new AudioContext();
await audioCtx.audioWorklet.addModule('testworklet.js');
mysource = new AudioWorkletNode(audioCtx,'testworklet');
mysource.connect(audioCtx.destination);
在 testworklet.js 中我定义
class TestWorklet extends AudioWorkletProcessor {
constructor(options){
super(options);
this.s = WebSocket('wss://localhost') // ERROR: WebSocket is undefined!
}
process(inputs,outputs) {
return true;
}
}
但是这段代码无法访问WebSocket,因为WebSocket在“window”作用域内,而代码运行在AudioWorkletGlobalScope下。
我如何使用 JavaScript?
解决方法
这是解决方案:您不需要。
对 documentation 进行更彻底的检查后发现了 port 属性:MessagePort 允许在处理器和工作集本身之间发送消息。由于处理器无法访问任何内容,因此我扩展了工作集以执行 i/o 工作并将数据发送到处理器。代码如下:
在工作集(主脚本)中,我可以访问所有内容。我获取数据并通过端口将其发送给工作人员
class MyWorkletNode extends AudioWorkletNode{
constructor(){
super(audioCtx,'testprocessor');
var p = this.port;
socket.on('audio_data',function(msg){
p.postMessage(msg['data']);
});
}
}
audioCtx = new AudioContext();
await audioCtx.audioWorklet.addModule('testprocessor.js');
mysource = new AudioWorkletNode(audioCtx,'testprocessor');
mysource.connect(audioCtx.destination);
在处理器中,我只是通过端口(而不是直接)从工作集接收数据:
class TestProcessor extends AudioWorkletProcessor {
constructor(options){
super();
this.port.addEventListener('message',(event) => {
this.ondata(event);
} );
this.port.start()
}
注意:我把之前不准确的名字:testworklet.js 改成了 testprocessor.js