RTCStatsReport

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] 的两个成员数组,按插入顺序排列。

描述

一个 Promise,它解析为 RTCStatsReport,从 RTCRtpReceiver.getStats()RTCRtpSender.getStats()RTCPeerConnection.getStats() 方法返回。在 RTCPeerConnection 上调用 getStats() 允许你指定是否希望获取出站统计信息、入站统计信息或整个连接的统计信息。RTCRtpReceiverRTCRtpSender 版本的 getStats() 仅分别返回入站和出站统计信息。

统计报告是一个只读的 Map 对象:一个有序字典,其中属性是唯一标识用于生成特定统计信息集的 WebRTC 对象的 id 字符串,而值是一个包含这些统计信息的字典对象。RTCStatsReport 可以像只读 Map 一样进行迭代和使用。

报告可能包含许多不同类别的统计信息,包括对等连接的当前端和远程端的入站和出站统计信息,有关编解码器、证书和使用的媒体的信息,等等。每类统计信息都以不同的统计信息字典对象类型提供,可以通过其 type 属性识别。

常见实例属性

所有字典类型都具有以下属性

id

一个字符串,唯一标识用于生成统计信息集的对象。此值在(至少)连接的生命周期内跨报告持续存在。但是请注意,对于某些统计信息,ID 可能在浏览器之间以及后续连接之间有所不同,即使连接到相同的对等方也是如此。

timestamp

一个高分辨率时间戳对象 (DOMHighResTimeStamp) 对象,指示采样时间。许多报告的统计信息是累积值;时间戳允许在任何两个报告之间以任何所需的报告速率计算速率和平均值。

type

一个字符串,其值指示对象包含的统计信息类型,例如 candidate-pairinbound-rtpcertificate 等等。 统计信息类型及其对应的对象 列在下面。

用户通常使用 forEach()for...of 循环迭代 RTCStatsReport,使用 type 属性选择感兴趣的统计信息。一旦使用 type 属性识别了特定的统计信息对象,就可以随后使用 id 属性与 get() 一起获取不同时间点的相同统计信息报告。

时间戳可用于计算在连接生命周期内累积的统计信息的平均值。

统计信息类型

下面列出了统计信息 type 值及其对应的字典。

type 字典 描述
candidate-pair RTCIceCandidatePairStats 描述从一个 RTCIceTransport 更改到另一个 RTCIceTransport 的统计信息,例如在 ICE 重启 期间。
certificate RTCCertificateStats 有关 RTCIceTransport 使用的证书的统计信息。
codec RTCCodecStats 有关此连接发送或接收的流使用的特定编解码器的统计信息。
data-channel RTCDataChannelStats 与连接上的一个 RTCDataChannel 相关的统计信息。
inbound-rtp RTCInboundRtpStreamStats 描述连接的入站数据流之一的状态的统计信息。
local-candidate RTCIceCandidateStats 有关与连接的 RTCIceTransport 关联的本地 ICE 候选者的统计信息。
media-source RTCAudioSourceStatsRTCVideoSourceStats 有关附加到 RTP 发送器的 MediaStreamTrack 生成的媒体的统计信息。此键映射到的字典取决于轨道的 kind
outbound-rtp RTCOutboundRtpStreamStats 描述此连接的出站数据流之一的状态的统计信息。
peer-connection RTCPeerConnectionStats 描述 RTCPeerConnection 状态的统计信息。
remote-candidate RTCIceCandidateStats 有关与连接的 RTCIceTransport 关联的远程 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 的出站统计信息。

代码遵循与上一个示例类似的模式,但在 RTCStatsReport.values() 上使用 for...of 循环进行迭代,并根据 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}: ${report[statName]}`);
  });
}

规范

规范
WebRTC:浏览器中的实时通信
# rtcstatsreport-object

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅