1

我正在使用 Angular 开发视频会议 Web 应用程序。我试图在我的AudioWorkletProcessor课堂上调用一些 wasm 函数。但是,我非常坚持如何将 wasm 模块传递给AudioWorkletProcessor然后调用这些函数。我能够从 emcc 生成的 js 文件中实例化 wasm 模块(使用命令:)emcc test.cpp -s WASM=1 -s MODULARIZE=1,然后options.processorOptions在我们构造AudioWorkletNode;时尝试通过参数传递这个模块。但是,似乎 Function 对象无法传递,因为它提供了DataCloneError. 有没有更好的方法来实例化 wasm 模块并将其传递给工作集处理器以便我可以使用它的功能?

audio.service.ts 的代码:

import { Injectable } from '@angular/core';
import { AudioContext, AudioWorkletNode } from 'standardized-audio-context';
import * as Module from '../../../assets/worklet/a.out.js'; // a.out.js is file generated by emcc
declare const WebAssembly: any;

@Injectable()
export class AudioService {
  audioCtx = new AudioContext();

  constructor() {}

  async createNewSetting(track) {
    const srcNode = this.audioCtx.createMediaStreamTrackSource(track);
    const destNode = this.audioCtx.createMediaStreamDestination();

    await this.audioCtx.resume();
    await this.audioCtx.audioWorklet.addModule(
      './assets/worklet/spatial-processor.js'
    );

    // Instantiate the wasm module and put in path to file
    const wasm = await Module({ locateFile: function(s) { return 'assets/worklet/' + s; }});
    
    // Will throw DataCloneError
    const spatialNode = new AudioWorkletNode(
      this.audioCtx,
      'spatial-processor',
      { processorOptions: {
        compiledModule: wasm
      }}
    );

    // Connect the nodes
    srcNode.connect(spatialNode);
    spatialNode.connect(destNode);

    // Return the updated audio stream
    return destNode.stream.getTracks()[0];

  }
}
    
4

1 回答 1

2

将实例化的 WASM 模块传递给工作人员(或 AudioWorklet)是不可能的。它仅在 WASM 模块已编译但尚未实例化时才有效。MDN 上有一个示例,它展示了如何使用普通工人执行此操作,但在processorOptions使用AudioWorkletProcessor.

https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module#sending_a_compiled_module_to_a_worker

这个想法是compileStreaming()在主线程和instantiate()工作线程中使用。

另一方面,也可以将所有内容直接导入 AudioWorklet,如本例所示。但是,我不建议这样做,因为在音频线程上编译代码可能会导致听得见的故障。

https://googlechromelabs.github.io/web-audio-samples/audio-worklet/design-pattern/wasm/

于 2021-01-11T21:57:08.763 回答