RTCRtpScriptTransformer: options 属性
options
是 RTCRtpScriptTransformer
接口的只读属性,它返回在构造相应 构造时作为第二个参数(可选)传递的对象 RTCRtpScriptTransform
。
值
一个对象。
描述
options
的最简单用法是让主线程指示相应的 RTCRtpScriptTransform
是否要添加到 WebRTC 发送器或接收器管道。如果同一工作线程用于处理传入和传出编码帧,那么这非常重要,因为它允许代码确定应将哪种转换应用于帧。
options
还可以用于将 消息通道 的第二个端口发送/传输到工作线程侧的转换器。然后,此通道可用于向转换流发送动态信息,例如加密密钥何时更改或添加。请注意,您也可以使用 Worker.postMessage()
向转换器发送消息,但您需要在工作线程用于不同上下文时适当地重定向消息(而消息端口选项提供了一个特定转换的直接通道)。
示例
如何指示当前 WebRTC 管道
RTCRtpScriptTransform
使用特定的 Worker
和 options
进行构造,然后通过将其分别分配给 RTCRtpSender.transform
或 RTCRtpReceiver.transform
插入 WebRTC 传出或传入管道。如果同一工作线程用于传入和传出管道的转换器,那么您需要在构造函数中提供 options
来指示要转换的编码帧是传入还是传出。
以下示例演示了如何在将轨道添加到对等连接 (RTCPeerConnection
) 后将 RTCRtpScriptTransform
添加到发送器管道,然后在收到轨道时将另一个转换器添加到接收器管道。
// videoSender is an RTCRtpSender.
const videoSender = peerConnection.addTrack(track, mediaStream);
videoSender.transform = new RTCRtpScriptTransform(worker, {
name: "senderTransform",
});
peerConnection.ontrack = (event) => {
// event.receiver is an RTCRtpReceiver
event.receiver.transform = new RTCRtpScriptTransform(worker, {
someOption: "receiverTransform",
});
};
在上面的每个示例中,我们都提供了一个对象,该对象对 options
对象的 name
属性具有不同的值,这指示了转换器添加到的管道。请注意,options
中属性的名称和值是任意的:重要的是主线程和工作线程都了解使用哪些属性和值。
以下代码演示了如何在工作线程中使用传递的 options
。首先,我们为 rtctransform
事件实现了一个处理程序,该事件在构造相应的 RTCRtpScriptTransform
时以及在新帧排队等待处理时在全局工作线程对象上触发。event.transformer
是一个具有 readable
、writable
和 options
属性的 RTCRtpScriptTransformer
。
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
参数中的属性传递。该端口还包含在作为第三个构造函数参数传递的数组中,因此它被传输到工作线程上下文。
const channel = new MessageChannel();
const transform = new RTCRtpScriptTransform(
worker,
{ purpose: "encrypter", port: channel.port2 },
[channel.port2],
);
然后,工作线程可以从在全局工作线程对象上触发的 rtctransform
事件中获取端口。
let messagePort;
addEventListener("rtctransform", (event) => {
messagePort = event.transformer.options.port;
// ... other transformer code
});
通道的每一端中的代码可以使用 MessagePort.postMessage()
向另一端发送和传输对象,并使用其 message
事件监听传入的消息。
例如,假设我们在名为 encryptionKey
的 Uint8Array
类型数组中有一个加密密钥,我们可以从主线程将其传输到工作线程,如所示
const encryptionKeyBuffer = encryptionKey.buffer;
channel.port1.postMessage(encryptionKeyBuffer, [encryptionKeyBuffer]);
工作线程将监听 message
事件以获取密钥
messagePort.addEventListener("message", (event) => {
const encryptionKeyBuffer = event.data;
// ... Use the encryptionKeyBuffer for encryption or any other purpose
};
有关更多信息和示例,请参阅 消息通道。
规范
规范 |
---|
WebRTC 编码转换器 # dom-rtcrtpscripttransformer-options |
浏览器兼容性
BCD 表格仅在浏览器中加载