防止 AudioWorkletNode 内存泄漏

Han*_*ley 7 javascript web-audio-api

我有一个 AudioWorkletNode,它是类实例的成员。当我删除/终止/删除该实例时,AudioWorkletNode 和 MessagePort 泄漏。

在删除实例之前,我确保相应的 AudioWorkletProcessor 的 process 方法没有运行。我还尝试调用端口的 close() 方法,甚至将 AudioWorkletNode 设置为 null。节点当时是否连接或断开似乎也并不重要。无论哪种方式都会泄漏。

建立audioWorklet模块:

AG_Recorder = class AG_Recorder {

  constructor(outNode) {

      AG_AudioManager.audioCtx.audioWorklet.addModule( '/audioWorkers/recorder.js').then(() => {

        this.recorderNode = new AudioWorkletNode(AG_AudioManager.audioCtx, 'recorder');
        this.recorderNode.connect(outNode);

        this.recorderNode.port.onmessage = (event) => {
          this.handleMessage(event.data);
        };

      }).catch(function (err) {
        console.log('recorder audioworklet error: ', err.name, err.message);
      });

   }
}
Run Code Online (Sandbox Code Playgroud)

以及处理器,为了相关性而强烈缩写:

class RecorderWorkletNode extends AudioWorkletProcessor {

  constructor (options) {

    super(options);
    this._running = true;

    this.port.onmessage = event => {

      if (event.data.release) {
        this._running = false;
      }
    }

    this.port.start();
  }

  process (inputs, outputs, parameters) {

    return this._running;
  }
}
Run Code Online (Sandbox Code Playgroud)

在节点断开连接并删除 AG_Recorder 实例之前,我尝试这样做:

release() {
    this.recorderNode.port.postMessage({release: true});
    this.recorderNode.port.onmessage = null;
    this.recorderNode.port.close();
    this.recorderNode = null;
 }
Run Code Online (Sandbox Code Playgroud)

小智 1

这似乎是 Chromium 的一个已确认的错误:

https://bugs.chromium.org/p/chromium/issues/detail?id=1298955

更新:不太确定 Firefox 等