RTCRtpSender: getCapabilities() 靜態方法
靜態方法 RTCRtpSender.getCapabilities() 返回一個物件,該物件描述了 RTCRtpSender 支援的編解碼器和頭部擴充套件功能。
類似地,您可以透過呼叫靜態函式 RTCRtpReceiver.getCapabilities() 來獲取裝置上 RTCRtpReceiver 物件的連線能力。
語法
RTCRtpSender.getCapabilities(kind)
引數
kind-
一個字串,指示請求瀏覽器傳送功能的媒體型別。支援的媒體型別為:
audio和video。
返回值
一個新物件,指示瀏覽器透過 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。每個物件具有以下屬性
描述
作為一個靜態函式,它始終以以下形式呼叫
capabilities = RTCRtpSender.getCapabilities("audio");
返回的功能集是最樂觀的可能列表。您在實際嘗試使用時,某些選項組合完全可能無法正常工作。
呼叫 RTCRtpSender.getCapabilities() 並不會以任何方式預先準備瀏覽器處理媒體。沒有任何內容被載入、獲取或以其他方式準備。它是一種在嘗試訪問媒體之前確定可能可用內容的方法。
由於可用功能集在一段時間內趨於穩定(人們不會經常安裝和解除安裝編解碼器等),因此媒體功能可以整體或部分地提供一種跨域識別使用者的方法。因此,在隱私敏感的上下文中,瀏覽器可能會選擇模糊功能;例如,可以透過省略很少使用的編解碼器配置來做到這一點。
編解碼器陣列
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 形式,也可能存在多個 FEC 條目。 - RTX (Retransmission)
-
此元件負責資料重傳;其媒體型別應為
video/rtx。RTX 將只有一個條目,並且它不會有sdpFmtpLine屬性。
如果您只關心與媒體相關的編解碼器,則應忽略這些條目。
示例
功能支援
您可以使用 Object.hasOwn() 來檢查 RTCRtpSender.getCapabilities() 是否受支援
log.textContent = `RTCRtpSender.getCapabilities() supported: ${Object.hasOwn(
RTCRtpSender,
"getCapabilities",
)}`;
檢查對特定編解碼器的支援
下面的函式返回 true 或 false,指示裝置是否支援在 RTCRtpSender 上傳送 H.264 影片。
注意: 由於 RTCRtpSender.getCapabilities() 實際上只指示可能的支援。因此,即使從該函式獲得肯定響應後,下面的 H.264 支援仍可能失敗。
function canSendH264() {
let capabilities = RTCRtpSender.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) {
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 |
瀏覽器相容性
載入中…