RTCStatsReport

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

* 此特性的某些部分可能存在不同級別的支援。

RTCStatsReport 介面是 WebRTC API 的一部分,它為 RTCPeerConnectionRTCRtpSenderRTCRtpReceiver 提供統計資訊報告。

RTCStatsReport 例項是一個只讀的 類似 Map 的物件,其中每個鍵是正在報告統計資訊的物件的識別符號,而對應的值是一個提供統計資訊的字典物件。

例項屬性

RTCStatsReport.size

返回 RTCStatsReport 物件中的專案數量。

例項方法

RTCStatsReport.entries()

返回一個新的 迭代器 物件,其中包含 RTCStatsReport 物件中每個元素的 [id, statistic-dictionary] 形式的雙成員陣列,按插入順序排列。

RTCStatsReport.forEach()

按插入順序,對 RTCStatsReport 物件中存在的每個鍵值對呼叫一次 callbackFn。如果向 forEach 提供了 thisArg 引數,它將用作每個回撥的 this 值。

RTCStatsReport.get()

返回與傳入的 id 關聯的統計資訊字典,如果不存在則返回 undefined

RTCStatsReport.has()

返回一個布林值,指示 RTCStatsReport 是否包含與指定的 id 關聯的統計資訊字典。

RTCStatsReport.keys()

返回一個新的 迭代器 物件,其中包含 RTCStatsReport 物件中每個元素的鍵(ID),按插入順序排列。

RTCStatsReport.values()

返回一個新的 迭代器 物件,其中包含 RTCStatsReport 物件中每個元素的 (統計資訊物件),按插入順序排列。

RTCStatsReport[Symbol.iterator]()

返回一個新的 迭代器 物件,其中包含 RTCStatsReport 物件中每個元素的 [id, statistic-dictionary] 形式的雙成員陣列,按插入順序排列。

描述

RTCRtpReceiver.getStats()RTCRtpSender.getStats()RTCPeerConnection.getStats() 方法返回一個解析為 RTCStatsReportPromise。對 RTCPeerConnection 呼叫 getStats() 可以讓你指定是希望獲取出站統計資訊、入站統計資訊還是整個連線的統計資訊。getStats()RTCRtpReceiverRTCRtpSender 版本分別只返回入站和出站統計資訊。

統計報告是一個只讀的 類似 Map 的物件:一個有序字典,其屬性是唯一標識用於生成特定統計資訊集的 WebRTC 物件的 id 字串,值是一個包含這些統計資訊的字典物件。RTCStatsReport 可以像只讀 Map 一樣進行迭代和使用。

報告可能包含許多不同的統計類別,包括當前和遠端端點之間對等連線的入站和出站統計資訊、有關編解碼器、證書和使用的媒體的資訊等等。每種統計類別都以不同型別的統計資訊字典物件提供,可以透過其 type 屬性來識別。

常見例項屬性

所有字典型別都具有以下屬性

id

一個唯一標識用於生成統計資訊集的物件的字串。此值在報告之間(至少在連線生命週期內)保持不變。請注意,對於某些統計資訊,ID 可能在瀏覽器之間以及後續連線(即使是與同一對等方)之間有所不同。

時間戳

一個高精度時間戳物件(DOMHighResTimeStamp),指示取樣時間。許多報告的統計資訊是累積值;時間戳允許計算任何兩次報告之間、以任何所需報告速率下的速率和平均值。

type

一個字串,其值指示物件包含的統計資訊型別,例如 candidate-pairinbound-rtpcertificate 等等。下文列出了 統計資訊的型別及其對應的物件

使用者通常會迭代 RTCStatsReport,使用 forEach()for...of 迴圈,並透過 type 屬性選擇感興趣的統計資訊。一旦使用 type 識別出特定的統計資訊物件,隨後就可以使用 id 屬性結合 get() 來在不同時間獲取相同的統計資訊報告。

時間戳可用於計算連線生命週期內累積的統計資訊的平均值。

統計資訊型別

下表列出了統計資訊 type 的值及其對應的字典。

type 字典 描述
candidate-pair RTCIceCandidatePairStats 描述從一個 RTCIceTransport 切換到另一個的統計資訊,例如在 ICE 重啟期間。
certificate RTCCertificateStats 關於 RTCIceTransport 使用的證書的統計資訊。
codec RTCCodecStats 關於此連線傳送或接收的流所使用的特定編解碼器的統計資訊。
data-channel RTCDataChannelStats 與連線上的一個 RTCDataChannel 相關的統計資訊。
inbound-rtp RTCInboundRtpStreamStats 描述連線的一個入站資料流狀態的統計資訊。
local-candidate RTCIceCandidateStats 關於與連線的 RTCIceTransports 關聯的本地 ICE 候選的統計資訊。
media-source RTCAudioSourceStatsRTCVideoSourceStats 關於附加到 RTP 傳送器的 MediaStreamTrack 生成的媒體的統計資訊。此鍵對映到的字典取決於軌道的 kind
outbound-rtp RTCOutboundRtpStreamStats 描述此連線的一個出站資料流狀態的統計資訊。
peer-connection RTCPeerConnectionStats 描述 RTCPeerConnection 狀態的統計資訊。
remote-candidate RTCIceCandidateStats 關於與連線的 RTCIceTransports 關聯的遠端 ICE 候選的統計資訊。
remote-inbound-rtp RTCRemoteInboundRtpStreamStats 從遠端對等方的角度描述入站資料流狀態的統計資訊。
remote-outbound-rtp RTCRemoteOutboundRtpStreamStats 從遠端對等方的角度描述出站資料流狀態的統計資訊。
transport RTCTransportStats 關於連線使用的傳輸的統計資訊。

示例

使用 forEach 迴圈迭代 RTCPeerConnection 的報告

此示例日誌顯示瞭如何記錄本地 RTCRtpReceiver 的與影片相關的統計資訊,該接收器負責接收流式媒體。

給定一個變數 myPeerConnection,它是 RTCPeerConnection 的一個例項,程式碼使用 await 等待統計資訊報告,然後使用 RTCStatsReport.forEach() 進行迭代。然後,它過濾字典,只保留 typeinbound-rtpkindvideo 的報告。

js
const stats = await myPeerConnection.getStats();

stats.forEach((report) => {
  if (report.type === "inbound-rtp" && report.kind === "video") {
    // Log the frame rate
    console.log(report.framesPerSecond);
  }
});

使用 for...of 迴圈迭代 RTCRtpSender 的報告

此示例顯示瞭如何迭代 RTCRtpSender 的出站統計資訊。

程式碼遵循與上一個示例類似的模式,但透過 for...of 迴圈對 RTCStatsReport.values() 進行迭代,並過濾 typeoutbound-rtp 的項。它假設你已經有一個名為“sender”的 RTCRtpSender 物件。

js
const stats = await sender.getStats();

for (const stat of stats.values()) {
  if (stat.type !== "outbound-rtp") continue;
  Object.keys(stat).forEach((statName) => {
    console.log(`${statName}: ${stat[statName]}`);
  });
}

規範

規範
WebRTC:瀏覽器中的即時通訊
# rtcstatsreport-object

瀏覽器相容性

另見