RTCRtpScriptTransformer: generateKeyFrame()

可用性有限

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

generateKeyFrame() 方法是 RTCRtpScriptTransformer 接口的方法,它会导致视频编码器生成关键帧。

语法

js
generateKeyFrame()
generateKeyFrame(rid)

参数

rid 可选

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

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

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

返回值

一个 Promise,它以帧的时间戳作为结果完成,或者以异常值为结果拒绝。

异常

InvalidStateError

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

TypeError

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

NotFoundError

没有视频编码器。如果相应的 RTCRtpSender 未处于活动状态或其轨道已结束,则可能会引发此错误。

描述

此方法可以由处理传出编码视频帧的转换器调用,以强制发送新的完整(关键)帧。它可能需要由 WebRTC 编码转换(加密帧)使用,以确保如果添加了新的加密密钥,则尽快发送使用该密钥加密的关键帧。

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

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

注意:一次发送多个流(RID)称为“同时传输”。此功能为 中间盒 提供了相同流的多个视频质量级别,允许它通过选择性地向参与者传输适当的级别并在运行时快速切换分辨率(例如,切换到为除活动发言者之外的所有人转发低质量视频)来管理带宽。接收方始终只获得一个流,这就是为什么可比较的接收方方法 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 编码转换
# dom-rtcrtpscripttransformer-generatekeyframe

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅