RTCRtpScriptTransformer:generateKeyFrame() 方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

generateKeyFrame() 方法是 RTCRtpScriptTransformer 介面的一部分,它會強制影片編碼器生成一個關鍵幀。

語法

js
generateKeyFrame()
generateKeyFrame(rid)

引數

rid 可選

一個字串,包含必須生成新關鍵幀的流/編碼器的“限制識別符號”(“RID”)。

該值必須介於 1 到 255 個字元(含)之間,並且只能包含字母數字字元、下劃線和連字元(A-Za-z0-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

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 Encoded Transform
# dom-rtcrtpscripttransformer-generatekeyframe

瀏覽器相容性

另見