RTCRtpScriptTransformer:sendKeyFrameRequest()

可用性有限

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

sendKeyFrameRequest()RTCRtpScriptTransformer 接口的方法,可以由正在处理传入编码视频帧的 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 编码转换
# dom-rtcrtpscripttransformer-sendkeyframerequest

浏览器兼容性

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

另请参阅