RTCRtpScriptTransformer:generateKeyFrame() 方法
generateKeyFrame() 方法是 RTCRtpScriptTransformer 接口的一部分,它会强制视频编码器生成一个关键帧。
语法
generateKeyFrame()
generateKeyFrame(rid)
参数
rid可选-
一个字符串,包含必须生成新关键帧的流/编码器的“限制标识符”(“RID”)。
该值必须介于 1 到 255 个字符(含)之间,并且只能包含字母数字字符、下划线和连字符(
A-Z、a-z、0-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。
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 事件。如果收到事件,它将获取 rid 和 key,然后调用 generateKeyFrame()。
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 |
浏览器兼容性
加载中…