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

浏览器兼容性

另见