RTCStatsReport
RTCStatsReport
接口是 WebRTC API 的一部分,它为 RTCPeerConnection
、RTCRtpSender
或 RTCRtpReceiver
提供统计报告。
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()
允许你指定是否希望获取出站统计信息、入站统计信息或整个连接的统计信息。RTCRtpReceiver
和 RTCRtpSender
版本的 getStats()
仅分别返回入站和出站统计信息。
统计报告是一个只读的 Map
类 对象:一个有序字典,其中属性是唯一标识用于生成特定统计信息集的 WebRTC 对象的 id
字符串,而值是一个包含这些统计信息的字典对象。RTCStatsReport
可以像只读 Map
一样进行迭代和使用。
报告可能包含许多不同类别的统计信息,包括对等连接的当前端和远程端的入站和出站统计信息,有关编解码器、证书和使用的媒体的信息,等等。每类统计信息都以不同的统计信息字典对象类型提供,可以通过其 type
属性识别。
常见实例属性
所有字典类型都具有以下属性
id
-
一个字符串,唯一标识用于生成统计信息集的对象。此值在(至少)连接的生命周期内跨报告持续存在。但是请注意,对于某些统计信息,ID 可能在浏览器之间以及后续连接之间有所不同,即使连接到相同的对等方也是如此。
timestamp
-
一个高分辨率时间戳对象 (
DOMHighResTimeStamp
) 对象,指示采样时间。许多报告的统计信息是累积值;时间戳允许在任何两个报告之间以任何所需的报告速率计算速率和平均值。 type
-
一个字符串,其值指示对象包含的统计信息类型,例如
candidate-pair
、inbound-rtp
、certificate
等等。 统计信息类型及其对应的对象 列在下面。
用户通常使用 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 |
RTCAudioSourceStats 或 RTCVideoSourceStats |
有关附加到 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()
进行迭代。然后,它过滤字典,仅保留 type
为 inbound-rtp
且 kind
为 video
的报告。
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
循环进行迭代,并根据 type
为 outbound-rtp
进行过滤。它假设你已经拥有一个名为“sender”的 RTCRtpSender
对象。
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 的浏览器中加载。