RTCRtpReceiver:getCapabilities() 靜態方法

Baseline 2023
新推出

自 ⁨2023 年 5 月⁩起,此功能可在最新的裝置和瀏覽器版本上使用。此功能可能無法在舊版裝置或瀏覽器上使用。

靜態方法 RTCRtpReceiver.getCapabilities() 返回一個物件,該物件描述了當前裝置上的 RTCRtpReceiver 物件所支援的編解碼器和頭部擴充套件功能。

同樣,您可以透過呼叫靜態函式 RTCRtpSender.getCapabilities() 來獲取 RTCRtpSender 物件的功能。

語法

js
RTCRtpReceiver.getCapabilities(kind)

引數

kind

一個字串,指示瀏覽器接收器功能所請求的媒體型別。支援的媒體型別包括:audiovideo

返回值

一個新物件,指示瀏覽器透過 RTCPeerConnection 接收指定媒體型別所具備的功能。如果瀏覽器不支援給定的媒體 kind,則返回值為 null

返回的物件具有以下屬性

codecs

一個物件陣列,每個物件描述了 RTCRtpReceiver 所支援的單個 媒體編解碼器 的基本功能。

注意: 陣列包含代表傳輸底層元件的特殊條目 — 如果您只關心實際用於媒體本身的編解碼器,則可以忽略這些條目。這些條目將在下方的 codecs 陣列 部分進行描述。

每個編解碼器物件具有以下屬性

channels 可選

一個正整數值,指示編解碼器支援的最大聲道數;例如,僅支援單聲道編解碼器的值為 1;立體聲編解碼器為 2,依此類推。

clockRate

一個正整數,指定編解碼器的時鐘速率(以赫茲 (Hz) 為單位)。IANA 維護著一份 編解碼器及其引數列表,包括它們的時鐘速率。

mimeType

一個字串,指示編解碼器的 MIME 媒體型別和子型別。RTP 使用的 MIME 型別字串與在其他地方使用的不同。有關這些型別的完整 IANA 登錄檔,請參閱 RFC 3555,第 4 節。有關此處可能引用的潛在編解碼器的詳細資訊,請參閱 WebRTC 使用的編解碼器

sdpFmtpLine 可選

一個字串,給出 SDP 中與編解碼器對應的 a=fmtp 行中的格式特定引數欄位(如果存在這樣的行)。如果不存在引數欄位,則此屬性將被省略。

headerExtensions

一個物件陣列,每個物件提供當前媒體 kind 所支援的 頭部擴充套件 的 URI。每個物件具有以下屬性

uri

一個字串,指定頭部擴充套件的 URI。URI 的格式按照 RFC 5285 中的描述進行。

描述

作為靜態函式,總是使用以下形式呼叫

js
capabilities = RTCRtpReceiver.getCapabilities("audio");

返回的功能集是最樂觀的可能列表。當您實際嘗試使用某些選項組合時,它們完全有可能失敗。

呼叫 RTCRtpReceiver.getCapabilities() 並不會以任何方式預載入瀏覽器來處理媒體。沒有任何內容被載入、獲取或以其他方式準備好。它是在開始嘗試訪問媒體之前用於確定哪些可能可用的一種方式。

由於可用功能集在一段時間內往往是穩定的(人們不會經常安裝和解除安裝編解碼器等),因此媒體功能可以整體或部分地提供一種跨域識別使用者的方法。出於此原因,在隱私敏感的上下文中,瀏覽器可能會選擇模糊化功能;例如,可以透過省略不常用的編解碼器配置來做到這一點。

codecs 陣列

codecs 陣列是一個物件陣列,描述單個編解碼器及其基本功能。瀏覽器只會分別報告不同的功能組合。如果兩組功能可以被描述為一組,那麼它們就會被合併。這意味著,例如,如果 H.264 編解碼器有兩個條目(由 mimeType 為 "video/H264" 標識),那麼在功能物件中將有其他值表明它們在某些方面有所不同。

有三個特殊條目應該始終存在,代表傳輸的底層元件。這些元件是

RED (REDundant Audio Data)

RED 條目的媒體型別可能因存在多個版本而異,但它將以 red 結尾,例如 video/redvideo/fwdred。基礎 RED 標準可在 RFC 2198 中找到。如果支援不同的形式,可能會有多個 RED 條目;在這種情況下,每個條目將具有唯一的媒體型別。

FEC (Forward Error Correction)

FEC 元件處理糾錯資料;其媒體型別也可能因存在標準的更高階版本而異,但它將始終以 fec 結尾。一個可能的值是 video/ulpfec(一種通用的糾錯模型)。如果支援多種形式,也可能存在多個 FEC 條目。

RTX (Retransmission)

此元件負責資料重傳;其媒體型別應為 video/rtx。RTX 將只有一個條目,並且不會有 sdpFmtpLine 屬性。

如果只關心與媒體相關的編解碼器,則應忽略這些條目。

示例

功能支援

您可以使用 Object.hasOwn() 來檢查 RTCRtpReceiver.getCapabilities() 是否受支援

js
log.textContent = `RTCRtpReceiver.getCapabilities() supported: ${Object.hasOwn(
  RTCRtpReceiver,
  "getCapabilities",
)}`;

檢查對特定編解碼器的支援

下面的函式返回一個布林值,指示裝置是否支援在 WebRTC 連線上接收 H.264 影片。

注意: 由於 RTCRtpReceiver.getCapabilities() 實際上只指示了 *可能的* 支援,即使從該函式獲得肯定響應後,嘗試接收 H.264 影片仍可能失敗。

js
function canReceiveH264() {
  let capabilities = RTCRtpReceiver.getCapabilities("video");

  capabilities.codecs.forEach((codec) => {
    if (codec.mimeType === "video/H264") {
      return true;
    }
  });
  return false;
}

獲取所有功能

此程式碼示例展示瞭如何獲取所有支援的編解碼器和頭部。HTML 定義了一個用於兩種功能型別的選擇列表和一個日誌區域。

html
<select id="kind">
  <option value="audio">audio</option>
  <option value="video">video</option>
</select>
<textarea rows="40" cols="100" id="log"></textarea>

JavaScript 定義了一個函式來記錄特定 "kind" 的功能。此函式最初以 audio 值呼叫。當選擇列表 kind 更改時,偵聽器會更新該值。

js
const log = document.querySelector("#log");
const kindSelector = document.querySelector("#kind");

logMediaCapabilities("audio");

kindSelector.addEventListener("click", () => {
  log.textContent = "";
  logMediaCapabilities(kindSelector.value);
});

function logMediaCapabilities(kind) {
  if (!Object.hasOwn(RTCRtpReceiver, "getCapabilities")) {
    log.textContent = "RTCRtpReceiver.getCapabilities() not supported";
    return;
  }
  const capabilities = RTCRtpReceiver.getCapabilities(`${kind}`);
  log.textContent += "Headers\n";
  capabilities.headerExtensions.forEach((header) => {
    log.textContent += ` uri: ${header.uri}\n`;
  });

  log.textContent += "\nCodecs\n";
  capabilities.codecs.forEach((codec) => {
    log.textContent += ` mime type: ${codec.mimeType}\n`;
    log.textContent += `   channels: ${codec.channels}\n`; // max channels - e.g. 2 is stereo
    log.textContent += `   clockRate: ${codec.clockRate}\n`; // clock rate in Hz
    log.textContent += `   sdpFmtpLine: ${codec.sdpFmtpLine}\n`; // mime media type and subtype
  });
}

結果

規範

規範
WebRTC:瀏覽器中的即時通訊
# dom-rtcrtpreceiver-getcapabilities

瀏覽器相容性