RTCRtpReceiver:getCapabilities() 靜態方法
靜態方法 RTCRtpReceiver.getCapabilities() 返回一個物件,該物件描述了當前裝置上的 RTCRtpReceiver 物件所支援的編解碼器和頭部擴充套件功能。
同樣,您可以透過呼叫靜態函式 RTCRtpSender.getCapabilities() 來獲取 RTCRtpSender 物件的功能。
語法
RTCRtpReceiver.getCapabilities(kind)
引數
kind-
一個字串,指示瀏覽器接收器功能所請求的媒體型別。支援的媒體型別包括:
audio和video。
返回值
一個新物件,指示瀏覽器透過 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。每個物件具有以下屬性
描述
作為靜態函式,總是使用以下形式呼叫
capabilities = RTCRtpReceiver.getCapabilities("audio");
返回的功能集是最樂觀的可能列表。當您實際嘗試使用某些選項組合時,它們完全有可能失敗。
呼叫 RTCRtpReceiver.getCapabilities() 並不會以任何方式預載入瀏覽器來處理媒體。沒有任何內容被載入、獲取或以其他方式準備好。它是在開始嘗試訪問媒體之前用於確定哪些可能可用的一種方式。
由於可用功能集在一段時間內往往是穩定的(人們不會經常安裝和解除安裝編解碼器等),因此媒體功能可以整體或部分地提供一種跨域識別使用者的方法。出於此原因,在隱私敏感的上下文中,瀏覽器可能會選擇模糊化功能;例如,可以透過省略不常用的編解碼器配置來做到這一點。
codecs 陣列
codecs 陣列是一個物件陣列,描述單個編解碼器及其基本功能。瀏覽器只會分別報告不同的功能組合。如果兩組功能可以被描述為一組,那麼它們就會被合併。這意味著,例如,如果 H.264 編解碼器有兩個條目(由 mimeType 為 "video/H264" 標識),那麼在功能物件中將有其他值表明它們在某些方面有所不同。
有三個特殊條目應該始終存在,代表傳輸的底層元件。這些元件是
- RED (REDundant Audio Data)
-
RED 條目的媒體型別可能因存在多個版本而異,但它將以
red結尾,例如video/red或video/fwdred。基礎 RED 標準可在 RFC 2198 中找到。如果支援不同的形式,可能會有多個 RED 條目;在這種情況下,每個條目將具有唯一的媒體型別。 - FEC (Forward Error Correction)
-
FEC 元件處理糾錯資料;其媒體型別也可能因存在標準的更高階版本而異,但它將始終以
fec結尾。一個可能的值是video/ulpfec(一種通用的糾錯模型)。如果支援多種形式,也可能存在多個 FEC 條目。 - RTX (Retransmission)
-
此元件負責資料重傳;其媒體型別應為
video/rtx。RTX 將只有一個條目,並且不會有sdpFmtpLine屬性。
如果只關心與媒體相關的編解碼器,則應忽略這些條目。
示例
功能支援
您可以使用 Object.hasOwn() 來檢查 RTCRtpReceiver.getCapabilities() 是否受支援
log.textContent = `RTCRtpReceiver.getCapabilities() supported: ${Object.hasOwn(
RTCRtpReceiver,
"getCapabilities",
)}`;
檢查對特定編解碼器的支援
下面的函式返回一個布林值,指示裝置是否支援在 WebRTC 連線上接收 H.264 影片。
注意: 由於 RTCRtpReceiver.getCapabilities() 實際上只指示了 *可能的* 支援,即使從該函式獲得肯定響應後,嘗試接收 H.264 影片仍可能失敗。
function canReceiveH264() {
let capabilities = RTCRtpReceiver.getCapabilities("video");
capabilities.codecs.forEach((codec) => {
if (codec.mimeType === "video/H264") {
return true;
}
});
return false;
}
獲取所有功能
此程式碼示例展示瞭如何獲取所有支援的編解碼器和頭部。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 更改時,偵聽器會更新該值。
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 |
瀏覽器相容性
載入中…