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

瀏覽器相容性

另見