RTCRtpScriptTransformer: sendKeyFrameRequest() 方法

基准线 2025
新推出

自 2025 年 10 月起,此功能已在最新的设备和浏览器版本中可用。此功能可能不适用于较旧的设备或浏览器。

RTCRtpScriptTransformer 接口的 sendKeyFrameRequest() 方法可以由处理传入的编码视频帧的 WebRTC 编码转换 调用,以从发送方请求关键帧。

该方法只能在接收视频(而不是音频)帧时调用,并且如果出于任何原因,接收方无法在没有新关键帧的情况下解码视频。请注意,用户代理可以决定不必要请求关键帧,在这种情况下,即使请求未实际发送,返回的 Promise 也会 fulfilled。

注意: 例如,当新用户加入 WebRTC 会议时,可能会调用此方法,以减少他们接收关键帧并因此开始显示视频所需的时间。有关更多信息,请参阅使用 WebRTC 编码转换中的 触发关键帧

语法

js
sendKeyFrameRequest()

参数

无。

返回值

一个 Promise,它在请求发送后(或用户代理决定不需要发送后)以 undefined fulfilled。

异常

InvalidStateError

解包器未处理视频数据包,或为 undefined

示例

下面的示例展示了正在接收编码视频的 WebRTC 应用程序的主线程如何将解密密钥传递给接收方转换,并请求发送方发出关键帧。

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

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

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

// Post new key to the receiver
channel.port1.start();
channel.port1.postMessage({
  key: "93ae0927a4f8e527f1gce6d10bc6ab6c",
});

工作线程中的 rtctransform 事件处理程序将端口作为 event.transformer.options.port 获取。下面的代码片段展示了如何使用它来监听通道上的 message 事件。如果收到事件,处理程序将获取 key,然后调用转换器上的 sendKeyFrameRequest()

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

  // Request sender to emit a key frame.
  // Here 'rcEvent' is the rtctransform event.
  rcEvent.transformer.sendKeyFrameRequest();
};

规范

规范
WebRTC Encoded Transform
# dom-rtcrtpscripttransformer-sendkeyframerequest

浏览器兼容性

另见