RTCRtpScriptTransformer: options 属性

有限可用性

此功能不是基线,因为它在一些最常用的浏览器中无法使用。

optionsRTCRtpScriptTransformer 接口的只读属性,它返回在构造相应 构造时作为第二个参数(可选)传递的对象 RTCRtpScriptTransform

一个对象。

描述

options 的最简单用法是让主线程指示相应的 RTCRtpScriptTransform 是否要添加到 WebRTC 发送器或接收器管道。如果同一工作线程用于处理传入和传出编码帧,那么这非常重要,因为它允许代码确定应将哪种转换应用于帧。

options 还可以用于将 消息通道 的第二个端口发送/传输到工作线程侧的转换器。然后,此通道可用于向转换流发送动态信息,例如加密密钥何时更改或添加。请注意,您也可以使用 Worker.postMessage() 向转换器发送消息,但您需要在工作线程用于不同上下文时适当地重定向消息(而消息端口选项提供了一个特定转换的直接通道)。

示例

如何指示当前 WebRTC 管道

RTCRtpScriptTransform 使用特定的 Workeroptions 进行构造,然后通过将其分别分配给 RTCRtpSender.transformRTCRtpReceiver.transform 插入 WebRTC 传出或传入管道。如果同一工作线程用于传入和传出管道的转换器,那么您需要在构造函数中提供 options 来指示要转换的编码帧是传入还是传出。

以下示例演示了如何在将轨道添加到对等连接 (RTCPeerConnection) 后将 RTCRtpScriptTransform 添加到发送器管道,然后在收到轨道时将另一个转换器添加到接收器管道。

js
// videoSender is an RTCRtpSender.
const videoSender = peerConnection.addTrack(track, mediaStream);
videoSender.transform = new RTCRtpScriptTransform(worker, {
  name: "senderTransform",
});
js
peerConnection.ontrack = (event) => {
  // event.receiver is an RTCRtpReceiver
  event.receiver.transform = new RTCRtpScriptTransform(worker, {
    someOption: "receiverTransform",
  });
};

在上面的每个示例中,我们都提供了一个对象,该对象对 options 对象的 name 属性具有不同的值,这指示了转换器添加到的管道。请注意,options 中属性的名称和值是任意的:重要的是主线程和工作线程都了解使用哪些属性和值。

以下代码演示了如何在工作线程中使用传递的 options。首先,我们为 rtctransform 事件实现了一个处理程序,该事件在构造相应的 RTCRtpScriptTransform 时以及在新帧排队等待处理时在全局工作线程对象上触发。event.transformer 是一个具有 readablewritableoptions 属性的 RTCRtpScriptTransformer

js
addEventListener("rtctransform", (event) => {
  let transform;
  // Select a transform based on passed options
  if (event.transformer.options.name == "senderTransform")
    transform = createSenderTransform(); // A TransformStream
  else if (event.transformer.options.name == "receiverTransform")
    transform = createReceiverTransform(); // A TransformStream
  else return;

  // Pipe frames from the readable to writeable through TransformStream
  event.transformer.readable
    .pipeThrough(transform)
    .pipeTo(event.transformer.writable);
});

该代码基于传递的 options 创建了不同的 TransformStream 来处理传出和传入帧,使用 createSenderTransform()createReceiverTransform()(然后将帧从 readable 通过选择的 TransformStream 传输到 writable)。

将消息端口传递给转换器

此示例演示了如何创建 消息通道 并将其端口之一传输到工作线程中运行的 WebRTC 编码转换器。然后,主线程可以在构造后向工作线程中运行的转换器发送和传输对象和消息,反之亦然。

以下代码首先创建一个 MessageChannel,然后构造一个 RTCRtpScriptTransform,并将 port2 值作为 options 参数中的属性传递。该端口还包含在作为第三个构造函数参数传递的数组中,因此它被传输到工作线程上下文。

js
const channel = new MessageChannel();

const transform = new RTCRtpScriptTransform(
  worker,
  { purpose: "encrypter", port: channel.port2 },
  [channel.port2],
);

然后,工作线程可以从在全局工作线程对象上触发的 rtctransform 事件中获取端口。

js
let messagePort;
addEventListener("rtctransform", (event) => {
  messagePort = event.transformer.options.port;
  // ... other transformer code
});

通道的每一端中的代码可以使用 MessagePort.postMessage() 向另一端发送和传输对象,并使用其 message 事件监听传入的消息。

例如,假设我们在名为 encryptionKeyUint8Array 类型数组中有一个加密密钥,我们可以从主线程将其传输到工作线程,如所示

js
const encryptionKeyBuffer = encryptionKey.buffer;
channel.port1.postMessage(encryptionKeyBuffer, [encryptionKeyBuffer]);

工作线程将监听 message 事件以获取密钥

js
  messagePort.addEventListener("message", (event) => {
    const encryptionKeyBuffer = event.data;
    // ... Use the encryptionKeyBuffer for encryption or any other purpose
  };

有关更多信息和示例,请参阅 消息通道

规范

规范
WebRTC 编码转换器
# dom-rtcrtpscripttransformer-options

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅