RTCRtpScriptTransformer:generateKeyFrame() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

generateKeyFrame() 方法是 RTCRtpScriptTransformer 接口的一部分,它会强制视频编码器生成一个关键帧。

语法

js
generateKeyFrame()
generateKeyFrame(rid)

参数

rid 可选

一个字符串,包含必须生成新关键帧的流/编码器的“限制标识符”(“RID”)。

该值必须介于 1 到 255 个字符(含)之间,并且只能包含字母数字字符、下划线和连字符(A-Za-z0-9-_)。RID 区分大小写,并且在对等通信通道中必须是唯一的。

将使用第一个匹配指定 rid 的编码器。如果没有编码器匹配 rid,则将使用第一个编码器,并将 rid 设置为该编码器的限制。

返回值

一个 Promise,它会在帧的时间戳处fulfilled,或者在发生异常时rejected。

异常

InvalidStateError

编码器未处理视频帧,或为 undefined

TypeError

提供的 rid 不符合语法要求。

NotFoundError

没有视频编码器。如果对应的 RTCRtpSender 不活跃或其轨道已结束,可能会抛出此错误。

描述

正在处理出站编码视频帧的转换器可以调用此方法,以强制发送新的完整(关键)帧。这可能对于加密帧的 WebRTC 编码转换 是必需的,以确保在添加新的加密密钥时,尽快发送使用该密钥加密的关键帧。

发送方可以指定 RID(也称为“限制标识符”或“RTP 流 ID”)来控制哪个编解码器生成新的关键帧。一个流可能包含同一源的多个版本(simulcast),每个版本具有不同的属性,例如分辨率和帧率。RID 用于指示特定的 RTP 流,从而指示需要生成新帧的编码器。请注意,可用的 RID 值在创建连接所使用的收发器时设置。可以通过调用 RTCRtpSender.getParameters() 并检查返回值的 encodings 属性来查询正在使用的 RID 值。

该方法返回的 Promise 将在将相应的关键帧排队到 RTCRtpScriptTransformer 可读流之前 resolve。

注意:一次发送多个流(RID)称为“simulcast”。此功能为 middlebox 提供同一流的多个视频质量级别,允许它通过选择性地将适当的级别传输给参与者来管理带宽,并快速动态地切换分辨率(即,将所有人的视频切换为低质量,除了活动发言者)。接收方只获取一个流,这就是为什么可比的接收方方法 RTCRtpScriptTransformer.sendKeyFrameRequest() 不需要指定 RID。

示例

发送关键帧

下面的示例展示了主线程如何将加密密钥传递给发送转换器,并触发编解码器生成关键帧。

请注意,主线程无法直接访问 RTCRtpScriptTransformer 对象,因此需要将密钥和 RID 传递给工作线程。在这里,我们通过 MessageChannel 实现这一点,将第二个端口传输到在工作线程中运行的转换器代码。代码假定已存在一个对等连接,并且 videoSender 是一个 RTCRtpSender

js
const worker = new Worker("worker.js");
const channel = new MessageChannel();

videoSender.transform = new RTCRtpScriptTransform(
  worker,
  { name: "senderTransform", port: channel.port2 },
  [channel.port2],
);

// Post RID and new key to the sender
channel.port1.start();
channel.port1.postMessage({
  rid: "1",
  key: "93ae0927a4f8e527f1gce6d10bc6ab6c",
});

工作线程中的 rtctransform 事件处理程序获取端口,并使用它监听 message 事件。如果收到事件,它将获取 ridkey,然后调用 generateKeyFrame()

js
event.transformer.options.port.onmessage = (event) => {
  const { rid, key } = event.data;
  // key is used by the transformer to encrypt frames (not shown)

  // Get codec to generate a new key frame using the rid
  // Here 'rcEvent' is the rtctransform event.
  rcEvent.transformer.generateKeyFrame(rid);
};

规范

规范
WebRTC Encoded Transform
# dom-rtcrtpscripttransformer-generatekeyframe

浏览器兼容性

另见