0

我创建了一个 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 是在“窗口”范围内,而代码是在 AudioWorkletGlobalScope 下运行的。

我如何使用javascript?

4

1 回答 1

1

这是解决方案:你没有。

更彻底地查看文档揭示了端口属性: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

于 2021-01-14T11:03:45.953 回答