RTCRtpSender: getCapabilities() 靜態方法

Baseline 2023
新推出

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

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

類似地,您可以透過呼叫靜態函式 RTCRtpReceiver.getCapabilities() 來獲取裝置上 RTCRtpReceiver 物件的連線能力。

語法

js
RTCRtpSender.getCapabilities(kind)

引數

kind

一個字串,指示請求瀏覽器傳送功能的媒體型別。支援的媒體型別為:audiovideo

返回值

一個新物件,指示瀏覽器透過 RTCPeerConnection 傳送指定媒體型別的能力。如果瀏覽器對給定的媒體 kind 沒有支援,則返回值為 null

返回的物件具有以下屬性

codecs

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

注意: 該陣列包含表示傳輸底層元件的特殊條目 — 如果您只對用於媒體本身的實際編解碼器感興趣,可以忽略它們。這些內容將在下面的 The codecs array 部分進行描述。

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

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 = RTCRtpSender.getCapabilities("audio");

返回的功能集是最樂觀的可能列表。您在實際嘗試使用時,某些選項組合完全可能無法正常工作。

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

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

編解碼器陣列

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 形式,也可能存在多個 FEC 條目。

RTX (Retransmission)

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

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

示例

功能支援

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

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

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

下面的函式返回 truefalse,指示裝置是否支援在 RTCRtpSender 上傳送 H.264 影片。

注意: 由於 RTCRtpSender.getCapabilities() 實際上只指示可能的支援。因此,即使從該函式獲得肯定響應後,下面的 H.264 支援仍可能失敗。

js
function canSendH264() {
  let capabilities = RTCRtpSender.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) {
  const capabilities = RTCRtpSender.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-rtcrtpsender-getcapabilities

瀏覽器相容性