我创建了一个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?
发布于 2021-01-14 19:03:46
这就是解决方案:你不需要。
对documentation的更深入的研究揭示了端口的属性:MessagePort允许在处理器和Worklet本身之间发送消息。因为处理器不能访问任何东西,所以我扩展了工作小程序来执行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
https://stackoverflow.com/questions/65717051
复制相似问题