AudioWorkletNode: port 属性

Baseline 已广泛支持

此特性已得到良好支持,可在多种设备和浏览器版本上使用。自 2021 年 4 月起,所有浏览器均已支持此特性。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

AudioWorkletNode 接口中只读的 port 属性会返回关联的 MessagePort。它可以用于节点与其关联的 AudioWorkletProcessor 之间进行通信。

注意: 通道另一端的端口可以通过处理器(processor)的 port 属性访问。

连接 AudioWorkletNode 及其关联 AudioWorkletProcessorMessagePort 对象。

示例

为了演示双向通信能力,我们将创建一个 AudioWorkletProcessor,它将输出静音并响应其 AudioWorkletNode 的 ping 请求。

首先,我们需要定义一个自定义的 AudioWorkletProcessor 并注册它。请注意,这应该在一个单独的文件中完成。

js
// ping-pong-processor.js
class PingPongProcessor extends AudioWorkletProcessor {
  constructor(...args) {
    super(...args);
    this.port.onmessage = (e) => {
      console.log(e.data);
      this.port.postMessage("pong");
    };
  }
  process(inputs, outputs, parameters) {
    return true;
  }
}

registerProcessor("ping-pong-processor", PingPongProcessor);

现在,在我们的主脚本文件中,我们将加载处理器,创建 AudioWorkletNode 实例(传入处理器的名称),并将节点连接到音频图。

js
const audioContext = new AudioContext();
await audioContext.audioWorklet.addModule("ping-pong-processor.js");
const pingPongNode = new AudioWorkletNode(audioContext, "ping-pong-processor");
// send the message containing 'ping' string
// to the AudioWorkletProcessor from the AudioWorkletNode every second
setInterval(() => pingPongNode.port.postMessage("ping"), 1000);
pingPongNode.port.onmessage = (e) => console.log(e.data);
pingPongNode.connect(audioContext.destination);

这将每秒向控制台输出 "ping""pong" 字符串。

规范

规范
Web Audio API
# dom-audioworkletnode-port

浏览器兼容性

另见