WebRTC 统计 API 的标识符

W3C 候选推荐草案

关于本文档的更多细节
本版本:
https://www.w3.org/TR/2025/CRD-webrtc-stats-20250925/
最新发布版本:
https://www.w3.org/TR/webrtc-stats/
最新编辑者草案:
https://w3c.github.io/webrtc-stats/
历史:
https://www.w3.org/standards/history/webrtc-stats/
提交历史
测试套件:
https://github.com/web-platform-tests/wpt/tree/master/webrtc-stats
实现报告:
https://wpt.fyi/webrtc-stats
编辑者:
Harald Alvestrand (Google)
Varun Singh (daily.co)
Henrik Boström (Google)
反馈:
GitHub w3c/webrtc-stats (拉取请求新问题未关闭问题)
public-webrtc@w3.org 主题行为 [webrtc-stats] … 消息主题 …归档
参与
邮件列表

摘要

本文档定义了一组 WebIDL 对象,这些对象允许访问关于 RTCPeerConnection 的统计 信息。

这些对象由 [WEBRTC] 中指定的 getStats API 返回。

本文档状态

本章节描述本文档在发布时的状态。当前 W3C 出版物以及本技术报告最新修订版的列表可在 W3C 标准和草案 索引中找到。

自上次作为候选推荐发布以来,统计对象已被显著重组,以便更好地匹配底层数据源。此外,networkType 属性 已因保护隐私而被废弃,并且 statsended 事件已因不再需要而被移除。

本文档由 Web 实时 通信工作组作为候选推荐草案,使用 推荐轨道发布。

作为候选推荐发布并不 意味着获得 W3C 及其成员的认可。候选 推荐草案整合了工作组 打算纳入后续候选推荐快照的、相对于前一候选推荐的更改。

这是一个草案文档,可能随时被其他 文档更新、替换或废弃。不应将本文档作为进行中的工作以外的内容来引用。

本文档由一个 依据 W3C 专利 政策运行的小组制作。 W3C 维护了一个 公开的专利披露列表, 其中列出了与该小组交付物相关的任何专利披露;该页面还包括 披露专利的说明。任何实际 知晓某项专利并认为该专利包含 必要权利要求的个人, 必须依照 W3C 专利政策第 6 节披露该信息。

本文档受 2025 年 8 月 18 日 W3C 流程文档约束。

1. 引言

本节是非规范性的。

通过对等连接传输的音频、视频或数据包可能会丢失,并且会经历不同程度的网络延迟。实现 WebRTC 的 Web 应用期望能够监测底层网络和媒体管线的性能。

本文档定义了 Web 应用用于从用户代理提取 度量的统计标识符。

2. 一致性

除标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性的。本规范中的其他所有内容均为规范性的。

本文档中的关键词 MAYMUSTMUST NOTSHOULD 在且仅在它们以全大写形式出现时, 应按 BCP 14 [RFC2119] [RFC8174] 中所述进行解释,如此处所示。

本规范定义了适用于单一产品的符合性标准: 用户代理

使用 ECMAScript 来实现本规范中定义的对象的实现 MUST 以与 Web IDL 规范中定义的 ECMAScript 绑定一致的方式实现它们 [WEBIDL],因为本文档使用了 该规范及其术语。

本规范并不定义符合性实现应该生成哪些对象。 引用本规范的规范需要自行指定 符合性。它们应该在其文档文本中放入如下内容(仅为示例):

3. 术语

术语 RTCPeerConnectionRTCDataChannelRTCDtlsTransportRTCDtlsTransportStateRTCIceTransportRTCIceRoleRTCIceTransportStateRTCDataChannelStateRTCIceCandidateTypeRTCStatsRTCCertificate 定义于 [WEBRTC]。

RTCPriorityType 定义于 [WEBRTC-PRIORITY]。

术语 RTP stream 定义于 [RFC7656]。

术语 Synchronization Source(SSRC)、 RTCP Sender Report (SR)、 RTCP Receiver Report (RR)定义于 [RFC3550]。

术语 RTCP Extended Report(XR)定义于 [RFC3611]。

audio sample 指的是音频轨道的任一声道中有一个样本——如果使用多个音频声道,基于样本的度量不会以更高的速率递增, 多个声道中同时有样本也计为单个样本。

4. 基本概念

stats 模型的基本对象是 stats object。以下术语被 定义用来描述它:

Monitored object

保存一组数据值的内部对象。大多数 monitored object 是 WebRTC API 中定义的 对象;可以将它们视为这些对象的内部属性。

Stats object
这是在某个特定时刻从 monitored object 复制出来的一组值。 它通过 getStats API 调用作为 WebIDL 字典返回。
Stats object reference

monitored object 有一个稳定的标识符 id,它会反映在由该 monitored object 生成的所有 stats object 中。stats object 可以使用此 id 值包含对 其他 stats object 的引用。在 stats object 中, 这些引用 由一个包含所引用 stats object 的 id 值的 DOMString 表示。

所有 stats object reference 的类型都是 DOMString,并且成员名称 以 Id 结尾,或者 它们的类型为 sequence<DOMString>, 且成员名称以 Ids 结尾。

Stats value
指 stats object 中的单个值。

monitored object 在其生命周期中会持续改变其包含的值,但 永远不会通过 getStats API 调用可见。stats object 一旦返回,就永远不会改变。

stats API 定义于 [WEBRTC]。它被定义为返回 stats object 的集合,其中每个 stats object 都是直接或 间接继承自 RTCStats 字典的字典。 此 API 在 [WEBRTC] 中规范性地定义,但在此 为便于引用而重现。

WebIDLdictionary RTCStats {
    required DOMHighResTimeStamp timestamp;
    required RTCStatsType        type;
    required DOMString           id;
};

时间戳使用 DOMHighResTimeStamp [HIGHRES-TIME] 表示,并被定义为 Performance.timeOrigin + 信息被收集时的 Performance.now()

4.1 stats object 设计指南

引入新的 stats object 时,应遵循以下原则:

stats 字典的新成员需要按照标准惯例 (camelCase)命名,如 [API-DESIGN-PRINCIPLES] 所述。

Id 结尾的名称(例如 transportId)始终是 stats object reference; 以 Ids 结尾的名称始终是 sequence<DOMString> 类型,其中 每个 DOMString 都是一个 stats object reference

如果 stats value 的自然名称会以 id 结尾(例如当 stats value 是 monitored object 的协议内标识符时),推荐做法是让 该名称以 identifier 结尾,例如 dataChannelIdentifier

Stats 由 Javascript 采样。通常,应用无法全面控制 stats 被采样的频率,并且实现无法知道 stats 的预期 用途是什么。按照设计,不存在供应用 影响 stats 生成方式的控制面。

因此,让实现计算“平均”速率并不是一个好主意,因为 这意味着存在某个无法预先设置的平均时间间隔。相反, 推荐的方法是统计某个值的测量次数,并对给出的 测量值求和,即使该和本身没有意义;然后 JS 应用可以 通过调用 getStats() 两次,取两个和的差,再除以两个计数的差, 来计算任意所需时间间隔内的平均值。

对于按时间度量的 stats,例如字节计数, 不需要单独的计数器;可以改为除以时间戳的差。

4.2 stats object 实现指南

实现 stats object 时,应遵守以下指南:

4.3 monitored object 的生命周期考虑

对象描述会说明从 stats 角度看 monitored object 的生命周期。当 monitored object 被 deleted 时,它不再出现在 stats 中;在此之前,它会出现。这可能对应也可能不对应 实现中某个对象的实际生命周期;对本规范而言,重要的是 stats 中出现的内容。

如果 monitored object 在一个 RTCPeerConnection 的生命周期内只能存在少数几个实例,则 最简单的做法可能是将其视为“永恒的”,并且永远不将它从 stats 中报告的对象集合中删除。此类对象将一直可见,直到 RTCPeerConnection 不再 可用;它在 pc.close() 之后的 getStats() 中也可见。这是在其规范中未提及生命周期时的默认情况。

随时间推移可能存在许多实例的对象,应该定义它们被 deleted 的时间,此后它们将停止出现在后续的 getStats() 调用中。 当对象被 deleted 时,我们可以保证后续任何 getStats() 调用都不会 包含引用该已删除对象的 stats object reference。我们还 保证已删除对象的 stats id 永远不会被重用于另一个 对象。这确保了收集已删除 monitored objectstats object 的应用, 将始终能够唯一地识别 任何 getStats() 调用结果中所指向的对象。

4.4 getStats() 结果缓存/节流指南

getStats() 的调用会触及 WebRTC 的许多组件,并可能需要相当长的时间 执行。实现可以利用也可以不利用对 getStats() 调用的缓存或节流来获得性能收益,但任何实现都必须遵守以下要求:

RTCPeerConnection 的状态 因 API 调用、promise 解析或事件触发而发生可见变化时,后续新的 getStats() 调用必须返回 受影响对象的最新字典。

当 stats object 被 deleted 时,后续的 getStats() 调用 MUST NOT 返回该 monitored object 的 stats。

5. stats object 类型的维护过程

5.1 添加新的 stats object

本文档指定了可互操作的 stats object 类型。新对象 类型的提案可以在 GitHub 上维护的编辑者草案中提出。新的标准类型可能会出现在未来版本的 W3C 推荐中。

如果发现需要新的 stats object 类型或 stats object 中的 stats value, 应在 Github 上提出 issue,并由审查过程决定是否将该 stat 添加到 编辑者草案中。

针对编辑者草案变更的拉取请求可以作为 讨论的指导,但最终合并取决于审查过程。

在 WebRTC WG 存续期间,它将作为审查机构;一旦其解散, W3C 将必须建立适当的审查。

所寻求的审查级别是 IETF 过程中的“专家审查”,定义见 [RFC5226] 第 4.1 节。所需文档包括新 stats 的名称、 它们的数据类型,以及它们所基于的定义,且应指定到允许 可互操作实现的程度。该规范可以由对其他 文档的引用组成。

希望引用特定版本(例如用于 符合性)的其他规范,应引用带日期的版本;当 发生更新时,将定期生成这些版本。

6. 缓解隐私问题的过程

WebRTC 的 Statistics API 暴露关于系统的信息, 包括硬件能力和网络特征。为了限制 此 API 所带来的指纹识别面,某些度量仅在 本节算法允许时才会暴露。 (这是一个指纹识别向量。)

6.1 限制硬件能力的暴露

为避免被动指纹识别,硬件能力应该只在 捕获上下文中暴露。这使用下面的算法进行测试。

检查 是否允许硬件 暴露,运行以下步骤:

  1. 如果 上下文捕获状态为 true,则返回 true。

  2. 否则返回 false。

7. RTCStatsType

类型为 RTCStatsTypetype 成员,表示 RTCStats 对象所代表的对象类型。具有给定 type 的对象只能 有一种 IDL 字典类型,但多个 type 值可以表示同一种 IDL 字典类型;例如,"local-candidate" 和 "remote-candidate" 都使用 IDL 字典类型 RTCIceCandidateStats

本规范对 RTCStatsType 的允许值是规范性的。

7.1 RTCStatsType 枚举

WebIDLenum RTCStatsType {
"codec",
"inbound-rtp",
"outbound-rtp",
"remote-inbound-rtp",
"remote-outbound-rtp",
"media-source",
"media-playout",
"peer-connection",
"data-channel",
"transport",
"candidate-pair",
"local-candidate",
"remote-candidate",
"certificate"
};

以下字符串是 RTCStatsType 的有效值:

codec

关于当前正由此 RTCPeerConnection 对象发送或 接收的 RTP stream 所使用的 编解码器的统计信息。它通过 RTCCodecStats 访问。

inbound-rtp

关于当前通过此 RTCPeerConnection 对象接收的入站 RTP stream 的统计信息。它通过 RTCInboundRtpStreamStats 访问。

RTX 流不会作为单独的 RTCInboundRtpStreamStats 对象出现,但会影响相关 RTCInboundRtpStreamStats 对象的 packetsReceivedbytesReceivedretransmittedPacketsReceivedretransmittedBytesReceived 计数器。

FEC 流不会作为单独的 RTCInboundRtpStreamStats 对象出现,但会影响相关 RTCInboundRtpStreamStats 对象的 packetsReceivedbytesReceivedfecPacketsReceivedfecBytesReceived 计数器。

outbound-rtp

关于当前通过此 RTCPeerConnection 对象发送的出站 RTP stream 的统计信息。它通过 RTCOutboundRtpStreamStats 访问。

当由于使用联播而有多个 RTP stream 连接到同一个发送方时,每个 RTP stream 都会有一个 RTCOutboundRtpStreamStats, 并具有不同的 ssrc 成员值。 RTX 流不会作为单独的 RTCOutboundRtpStreamStats 对象出现,但会影响相关 RTCOutboundRtpStreamStats 对象的 packetsSentbytesSentretransmittedPacketsSentretransmittedBytesSent 计数器。

remote-inbound-rtp

关于远端端点的入站 RTP stream 的统计信息,该入站 RTP stream 对应于当前通过此 RTCPeerConnection 对象发送的出站 流。它在远端端点测量,并在 RTCP Receiver Report(RR)或 RTCP Extended Report(XR)中报告。它通过 RTCRemoteInboundRtpStreamStats 访问。

remote-outbound-rtp

关于远端端点的出站 RTP stream 的统计信息,该出站 RTP stream 对应于当前通过此 RTCPeerConnection 对象接收的入站 流。它在远端端点测量,并在 RTCP Sender Report(SR)中报告。它 通过 RTCRemoteOutboundRtpStreamStats 访问。

media-source

关于由当前附加到 RTCRtpSenderMediaStreamTrack 所产生媒体的统计信息。这 反映送入编码器的媒体;即应用 getUserMedia() 约束之后的媒体 (即不是摄像头产生的原始媒体)。根据其 kind,它要么是 RTCAudioSourceStats,要么是 RTCVideoSourceStats

media-playout

与音频播放相关的统计信息。它通过 RTCAudioPlayoutStats 访问。

peer-connection

RTCPeerConnection 对象相关的统计信息。它通过 RTCPeerConnectionStats 访问。

data-channel

与每个 RTCDataChannel id 相关的统计信息。 它通过 RTCDataChannelStats 访问。

transport

RTCPeerConnection 对象相关的传输统计信息。它 通过 RTCTransportStats 访问。

candidate-pair

RTCIceTransport 对象相关的 ICE 候选对统计信息。它 通过 RTCIceCandidatePairStats 访问。

RTCIceTransport 执行 ICE 重启时,不是传输当前对的候选对会在 状态变为 "new" 时被 deleted。作为传输当前对的 候选对会在 ICE 重启之后,即 RTCIceTransport 切换为使用由 新候选生成的候选对时被 deleted; 这个时间不对应于任何其他外部可观察的 事件。

local-candidate

RTCIceTransport 对象相关的 ICE 本地候选统计信息。 它通过本地候选的 RTCIceCandidateStats 访问。

RTCIceTransport 执行 ICE 重启,并且该候选不再是任何未删除候选对的成员时, 本地候选会被 deleted

remote-candidate

RTCIceTransport 对象相关的 ICE 远端候选统计信息。 它通过远端候选的 RTCIceCandidateStats 访问。

RTCIceTransport 执行 ICE 重启,并且该候选不再是任何未删除候选对的成员时, 远端候选会被 deleted

certificate

关于 RTCIceTransport 所使用证书的信息。 它通过 RTCCertificateStats 访问。

8. 统计字典

8.1 RTP 统计层级

RTP 统计的字典被结构化为一个层级,这样那些在许多不同上下文中都有意义的 stats 只需在 IDL 中表示一次。

此处暴露的度量对应于本地测量以及 RTCP 包所报告的度量。 复合 RTCP 包包含多个 RTCP 报告块,例如 Sender Report(SR)和 Receiver Report(RR),而非复合 RTCP 包可能 只包含单个 RTCP SR 或 RR 块。

所有 RTP monitored object 的生命周期都绑定到 SSRCRTCOutboundRtpStreamStats 在 RTP 发送方通过 设置本地或远端 SDP 应答(通过 setLocalDescription()setRemoteDescription(),并且信令状态返回到 "stable")而完成配置时创建。RTCInboundRtpStreamStats 在 接收到此 SSRC 的第一个 RTP 包时创建,而远端 RTP stream stats 对象(RTCRemoteInboundRtpStreamStatsRTCRemoteOutboundRtpStreamStats) 在首次接收到对应的 RTCP 包时创建。

当对应的 RTP 发送方或 RTP 接收方被重新配置以移除对应的 RTP stream 时,RTP monitored object 会被删除。 当 ssrc 发生变化、某个 simulcast 层被丢弃,或者 RTCRtpTransceivercurrentDirection 变为 "stopped" 时,旧 SSRC 会发生这种情况。 如果 transceiver 被设为 "inactive",或者 encoding 的 active 参数被设为 false,则 monitored object 不会被删除。如果在删除事件 发生后回收某个 SSRC,则这被视为一个新的 RTP monitored object,并且新的 RTP stream stats 将具有重置后的计数器和新的 ID。

对于给定的 RTP stats object,其总计数器必须始终增加, 但由于 SSRC 变化、simulcast 层被丢弃或 transceiver 停止,RTP stats object 可能会被删除和/或被新的 RTP stats object 替换。调用者在聚合 多个 RTP stats object 的包计数器时需要注意这一点(聚合值可能会 因删除而减少)。

某个 RTCRtpSender 正在发送两层 simulcast(位于 SSRC=111 和
SSRC=222)。可以观察到两个 "outbound-rtp" stats object,一个具有
SSRC=111,另一个具有 SSRC=222。两个对象的包计数器都在
增加。

使用 RTCRtpSender.setParameters() 停用其中一层。虽然
这会暂停其中一层(其包计数器冻结),但 RTP
monitored object 不会被删除。RTCRtpTransceiver 被协商为
"inactive",而 RTP monitored object 仍不会被删除。
当 RTCRtpTransceiver 再次变为 "sendonly" 时,相同的
"outbound-rtp" 对象会继续被使用。

稍后,调用 RTCRtpTransceiver.stop()。"outbound-rtp" 对象
仍然存在,但其包计数器已经冻结。重新协商
发生,并且 transceiver.currentDirection 变为 "stopped",此时
两个 "outbound-rtp" 对象都已被删除。

层级如下:

RTCRtpStreamStats:适用于任意 RTP stream 任一端的 stats

8.2 RTCRtpStreamStats 字典

WebIDLdictionary RTCRtpStreamStats : RTCStats {
             required unsigned long       ssrc;
             required DOMString           kind;
             DOMString           transportId;
             DOMString           codecId;
};

字典 RTCRtpStreamStats 成员

ssrc, 类型为 unsigned long

同步源(SSRC)标识符是依据 [RFC3550] 的无符号整数值,用于标识此 stats object 所描述的 RTP 包流。

对于出站和入站本地,SSRC 分别描述由这些端点 发送和接收的 RTP stream 的 stats。 对于远端入站和远端出站,SSRC 描述由远端端点 接收和发送到远端端点的 RTP stream 的 stats。

kind, 类型为 DOMString

要么是 "audio",要么是 "video"。这 MUST 匹配相关 MediaStreamTrackkind 属性。

transportId 的类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 RTP stream 相关联的 RTCTransportStats 的对象。

codecId, 类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 RTP stream 相关联的 RTCCodecStats 的对象。

8.3 RTCCodecStats 字典

编解码器在为 RTP 传输注册时创建, 但只有正在使用的编解码器子集(被 RTP stream 引用)会在 getStats() 中暴露。

当一个或多个 codecId 引用该编解码器时, 会创建 RTCCodecStats 对象。当不再 存在任何对 RTCCodecStats 的引用时,该 stats object 会被删除。如果将来再次使用相同的编解码器, RTCCodecStats 对象会以与 之前相同的 id 复活。

编解码器对象可以被使用相同传输的 媒体节中的多个 RTP stream 引用,但 不同传输中的相似编解码器具有不同的 RTCCodecStats 对象。

期望用户代理将信息合并到每个传输的每个 payload type 的单个 "codec" 条目中,除非 sdpFmtpLine 在每个方向上不同, 在这种情况下需要两个 条目(一个用于编码,一个用于解码)。

WebIDLdictionary RTCCodecStats : RTCStats {
             required unsigned long payloadType;
             required DOMString     transportId;
             required DOMString     mimeType;
             unsigned long clockRate;
             unsigned long channels;
             DOMString     sdpFmtpLine;
};

字典 RTCCodecStats 成员

payloadType,类型为 unsigned long

在 RTP 编码或解码中使用的 payload type。

transportId 的类型为 DOMString

正在使用此编解码器的传输的唯一标识符,可用于 查找对应的 RTCTransportStats 对象。

mimeType, 类型为 DOMString

IANA 媒体类型注册表 [IANA-MEDIA-TYPES] 中定义的 codec MIME 媒体类型/子类型, 例如 video/VP8。

clockRate,类型为 unsigned long

表示媒体采样率。

channels,类型为 unsigned long

存在时,表示声道数(mono=1,stereo=2)。

sdpFmtpLine 的类型为 DOMString

来自 SDP 中与该编解码器对应的 a=fmtp 行的“格式特定参数”字段,如果存在, 如 [RFC8829](第 5.8 节) 所定义。

8.4 RTCReceivedRtpStreamStats 字典

WebIDLdictionary RTCReceivedRtpStreamStats : RTCRtpStreamStats {
             unsigned long long   packetsReceived;
             unsigned long long   packetsReceivedWithEct1;
             unsigned long long   packetsReceivedWithCe;
             unsigned long long   packetsReportedAsLost;
             unsigned long long   packetsReportedAsLostButRecovered;
             long long            packetsLost;
             double               jitter;
};
packetsReceived,类型为 unsigned long long

为此 SSRC 接收的 RTP 包总数。这包括 重传。 在接收端点,这按 [RFC3550] 第 6.4.1 节定义的方式计算。在发送 端点,packetsReceived 通过从扩展最高接收序列号中减去累计丢包数来估算, 这两者均在 RTCP Receiver Report 中报告,然后减去在 RTCP Sender Report 中发送到此 SSRC 的初始扩展序列号, 再加一,以映射 [RFC3550] 附录 A.3 中讨论的内容, 但用于发送方一侧。如果尚未接收到 RTCP Receiver Report, 则返回 0。

packetsReceivedWithEct1,类型为 unsigned long long

为此 SSRC 接收的、标记有 "ECT(1)" 标记的 RTP 包总数。

packetsReceivedWithCe,类型为 unsigned long long

为此 SSRC 接收的、标记有 "CE" 标记的 RTP 包总数。

packetsReportedAsLost,类型为 unsigned long long

已随零 R bit 发送 [RFC8888] 第 3.1 节报告的 RTP 包总数。 仅当已协商对 "ccfb" 反馈机制的支持时才 存在

packetsReportedAsLostButRecovered,类型为 unsigned long long

已随零 R bit 发送 [RFC8888] 第 3.1 节报告, 但同一包的后续报告将 R bit 设为 1 的 RTP 包总数。 仅当已协商对 "ccfb" 反馈机制的支持时才 存在

packetsLost,类型为 long long

为此 SSRC 丢失的 RTP 包总数。 按 [RFC3550] 第 6.4.1 节定义的方式计算。请注意,由于这是估算值, 如果接收的包多于发送的包,它可能为负。

jitter,类型为 double

为此 SSRC 测得的 Packet Jitter, 单位为秒。按 [RFC3550] 第 6.4.1 节中定义的方式计算。

RTCInboundRtpStreamStats 字典表示 传入 RTP 媒体流的 测量度量。统计对象中报告的时间戳是 数据被采样的时间。

WebIDLdictionary RTCInboundRtpStreamStats : RTCReceivedRtpStreamStats {
             required DOMString   trackIdentifier;
             DOMString            mid;
             DOMString            remoteId;
             unsigned long        framesDecoded;
             unsigned long        keyFramesDecoded;
             unsigned long        framesRendered;
             unsigned long        framesDropped;
             unsigned long        frameWidth;
             unsigned long        frameHeight;
             double               framesPerSecond;
             unsigned long long   qpSum;
             double               totalDecodeTime;
             double               totalInterFrameDelay;
             double               totalSquaredInterFrameDelay;
             unsigned long        pauseCount;
             double               totalPausesDuration;
             unsigned long        freezeCount;
             double               totalFreezesDuration;
             DOMHighResTimeStamp  lastPacketReceivedTimestamp;
             unsigned long long   headerBytesReceived;
             unsigned long long   packetsDiscarded;
             unsigned long long   fecBytesReceived;
             unsigned long long   fecPacketsReceived;
             unsigned long long   fecPacketsDiscarded;
             unsigned long long   bytesReceived;
             unsigned long        nackCount;
             unsigned long        firCount;
             unsigned long        pliCount;
             double               totalProcessingDelay;
             DOMHighResTimeStamp  estimatedPlayoutTimestamp;
             double               jitterBufferDelay;
             double               jitterBufferTargetDelay;
             unsigned long long   jitterBufferEmittedCount;
             double               jitterBufferMinimumDelay;
             unsigned long long   totalSamplesReceived;
             unsigned long long   concealedSamples;
             unsigned long long   silentConcealedSamples;
             unsigned long long   concealmentEvents;
             unsigned long long   insertedSamplesForDeceleration;
             unsigned long long   removedSamplesForAcceleration;
             double               audioLevel;
             double               totalAudioEnergy;
             double               totalSamplesDuration;
             unsigned long        framesReceived;
             DOMString            decoderImplementation;
             DOMString            playoutId;
             boolean              powerEfficientDecoder;
             unsigned long        framesAssembledFromMultiplePackets;
             double               totalAssemblyTime;
             unsigned long long   retransmittedPacketsReceived;
             unsigned long long   retransmittedBytesReceived;
             unsigned long        rtxSsrc;
             unsigned long        fecSsrc;
             double               totalCorruptionProbability;
             double               totalSquaredCorruptionProbability;
             unsigned long long   corruptionMeasurements;
            };

字典 RTCInboundRtpStreamStats 成员

trackIdentifier,类型为 DOMString

MediaStreamTrackid 属性的值。

mid,类型为 DOMString

如果拥有此流的 RTCRtpTransceiver 具有一个不为 nullmid 值, 则这是该值;否则此成员 MUST NOT 存在

remoteId, 类型为 DOMString

remoteId 用于查找同一 SSRC 的远端 RTCRemoteOutboundRtpStreamStats 对象。

framesDecoded

对于音频,MUST NOT 存在。它表示 此 RTP stream 中正确解码的帧总数,即如果没有丢弃帧时 会显示的帧。

keyFramesDecoded,类型为 unsigned long

对于音频,MUST NOT 存在。它表示 此 RTP 媒体流中成功解码的关键帧总数,例如 VP8 [RFC6386] 中的 key frames,或 H.264 [RFC6184] 中的 IDR-frames。 这是 framesDecoded 的一个子集。 framesDecoded - keyFramesDecoded 得到 已解码 delta frames 的数量。

framesRendered

对于音频,MUST NOT 存在。它表示 已渲染的帧总数。它在一帧被渲染之后立即递增。

framesDropped,类型为 unsigned long

对于音频,MUST NOT 存在。对于此接收器的轨道, 在解码前丢弃或因帧错过其显示期限而丢弃的帧总数。该测量 在接收器创建时开始,并且是 [RFC7004] 附录 A (g) 中定义的累积度量。

frameWidth,类型为 unsigned long

对于音频,MUST NOT 存在。表示最后解码帧的 宽度。在第一帧解码之前,此成员 MUST NOT 存在

frameHeight,类型为 unsigned long

对于音频,MUST NOT 存在。表示最后解码帧的 高度。在第一帧解码之前,此成员 MUST NOT 存在

framesPerSecond,类型为 double

对于音频,MUST NOT 存在。上一秒内 解码的帧数。

qpSum,类型为 unsigned long long

对于音频,MUST NOT 存在。由此 接收器解码的帧的 QP 值之和。帧计数位于 framesDecoded 中。

QP 值的定义取决于编解码器;对于 VP8,QP 值是 帧头中作为语法元素 y_ac_qi 携带的值,并在 [RFC6386] 第 19.2 节中定义。 其范围是 0..127。

请注意,QP 值只是所使用量化器值的指示;许多 格式都有在帧内改变量化器值的方法。

totalDecodeTime,类型为 double

对于音频,MUST NOT 存在。 解码此流的 framesDecoded 帧所花费的总秒数。平均解码时间可以通过用此 值除以 framesDecoded 来计算。 解码一帧所花的时间是 将一帧送入解码器与解码器返回该帧的已解码 数据之间经过的时间。

totalInterFrameDelay,类型为 double

对于音频,MUST NOT 存在。 连续渲染帧之间的帧间延迟之和(单位为秒), 在一帧被渲染之后立即记录。帧间延迟方差可 根据 totalInterFrameDelaytotalSquaredInterFrameDelayframesRendered 按以下公式计算: (totalSquaredInterFrameDelay - totalInterFrameDelay^2/ framesRendered)/framesRendered

totalSquaredInterFrameDelay,类型为 double

对于音频,MUST NOT 存在。 连续渲染帧之间的帧间延迟平方和(单位为秒), 在一帧被渲染之后立即记录。关于如何计算帧间延迟方差, 详见 totalInterFrameDelay

pauseCount,类型为 unsigned long

对于音频,MUST NOT 存在。 统计此接收器经历的视频暂停总次数。 如果自最后渲染帧以来经过的时间超过 5 秒, 则认为视频处于暂停状态。pauseCount 在这种暂停之后渲染一帧时递增。

totalPausesDuration,类型为 double

对于音频,MUST NOT 存在。 暂停的总持续时间(关于暂停的定义,见 pauseCount), 单位为秒。该值在一帧被渲染时更新。

freezeCount,类型为 unsigned long

对于音频,MUST NOT 存在。 统计此接收器经历的视频冻结总次数。 如果帧持续时间,即两个连续渲染帧之间的时间间隔, 等于或超过 Max(3 * avg_frame_duration_ms, avg_frame_duration_ms + 150), 则它是一次冻结,其中 avg_frame_duration_ms 是最近 30 个渲染 帧的持续时间的线性平均值。

totalFreezesDuration,类型为 double

对于音频,MUST NOT 存在。 被认为冻结的渲染帧的总持续时间(关于 freeze 的定义,见 freezeCount), 单位为秒。该值 在一帧被渲染时更新。

lastPacketReceivedTimestamp,类型为 DOMHighResTimeStamp

表示为此 SSRC 接收最后一个包时的时间戳。 这不同于 timestamp,后者表示 本地端点生成 统计信息的时间。

headerBytesReceived,类型为 unsigned long long

为此 SSRC 接收的 RTP 头和填充字节总数。 这包括重传。 这不包括 IP 或 UDP 等传输层头的大小。 headerBytesReceived + bytesReceived 等于在传输上 作为 payload 接收的字节数。

packetsDiscarded,类型为 unsigned long long

由于过晚或过早到达而被 jitter buffer 丢弃的 RTP 包的累计数量, 即这些包不会被播放。由于包重复而丢弃的 RTP 包 不会在此度量中报告 [XRBLOCK-STATS]。 按 [RFC7002] 第 3.2 节和附录 A.a 中定义的方式计算。

fecBytesReceived,类型为 unsigned long long

为此 SSRC 接收的 RTP FEC 字节总数, 仅包括 payload 字节。 这是 bytesReceived 的一个子集。如果协商了使用不同 ssrc 的 FEC 机制,则 FEC 包会通过 单独的 SSRC 发送,但仍在此处计入。

fecPacketsReceived,类型为 unsigned long long

为此 SSRC 接收的 RTP FEC 包总数。如果协商了 使用不同 ssrc 的 FEC 机制,则 FEC 包会通过 单独的 SSRC 发送,但仍在此处计入。 当接收与媒体包带内传输的 FEC 包时 (例如使用 Opus),此计数器也可以递增。

fecPacketsDiscarded,类型为 unsigned long long

为此 SSRC 接收的、 其纠错 payload 被应用丢弃的 RTP FEC 包总数。 这可能发生于:1. FEC 包保护的所有源包 都已接收或已由单独的 FEC 包恢复;或 2. FEC 包到达过晚, 即在恢复窗口之外,并且丢失的 RTP 包已经在 播放期间被跳过。这是 fecPacketsReceived 的一个子集。

bytesReceived,类型为 unsigned long long

为此 SSRC 接收的字节总数。这包括 重传。 按 [RFC3550] 第 6.4.1 节中定义的方式计算。

firCount,类型为 unsigned long

对于音频,MUST NOT 存在。统计 此接收器发送的 Full Intra Request (FIR) 包总数, 如 [RFC5104] 第 4.3.1 节中所定义。不统计 [RFC2032] 中指出的 RTCP FIR,它已被 [RFC4587] 废弃。

pliCount,类型为 unsigned long

对于音频,MUST NOT 存在。统计 此接收器发送的 Picture Loss Indication (PLI) 包总数,如 [RFC4585] 第 6.3.1 节中所定义。

totalProcessingDelay,类型为 double

它是每个 audio sample 或视频帧从 第一个 RTP 包被接收的时间(接收时间戳)到 对应样本或帧被解码的时间(解码时间戳)所花费时间的总和,单位为秒。 此时 audio sample 或视频帧已准备好由 MediaStreamTrack 播放。这里的准备好播放通常指 audio sample 或视频帧已由 解码器完全解码之后。

鉴于其中涉及的复杂性,到达时间或接收时间戳会尽可能 接近网络层测量,而解码时间戳会在 完整样本或帧被解码后立即测量。

对于音频,同一 RTP 包中会接收多个样本,所有样本 将共享相同的接收时间戳和不同的解码时间戳。 对于视频,一帧会通过多个 RTP 包接收,在这种 情况下,包含该帧的最早时间戳被计为接收时间戳, 而解码时间戳对应于完整帧被解码的时间。

此度量不会因未解码的帧而递增, 即 framesDropped。 平均处理延迟可以通过将 totalProcessingDelay 除以 视频的 framesDecoded (或音频的 provisional stats spec totalSamplesDecoded)来计算。

nackCount,类型为 unsigned long

统计此接收器发送的 Negative ACKnowledgement (NACK) 包总数, 如 [RFC4585] 第 6.2.1 节中所定义。

estimatedPlayoutTimestamp,类型为 DOMHighResTimeStamp

这是此接收器轨道的估计播放时间。播放时间是 最后一个可播放的 audio sample 或视频帧的 NTP 时间戳,该样本或帧具有已知 时间戳(来自将 RTP 时间戳映射到 NTP 时间戳的 RTCP SR 包), 并用其准备好播放后经过的时间进行外推。这是发送方 NTP 时钟时间中的轨道 “当前时间”,即使当前没有音频播放也可以存在。

这可用于估计来自同一来源的两个 轨道之间音频和视频不同步的程度,audioInboundRtpStats.estimatedPlayoutTimestamp - videoInboundRtpStats.estimatedPlayoutTimestamp

jitterBufferDelay,类型为 double

jitter buffer 的用途是将 RTP 包重新组合为帧(对于 视频) 并实现平滑播放。这里描述的模型假设样本或帧 仍处于压缩状态且尚未被解码。 它是每个 audio sample 或视频帧从 第一个包被 jitter buffer 接收的时间(进入时间戳)到 其离开 jitter buffer 的时间(发出时间戳)所花费时间的总和,单位为秒。 对于音频,多个样本属于同一个 RTP 包,因此它们将 具有相同的 进入时间戳但具有不同的 jitter buffer 发出时间戳。 对于视频,帧可能通过多个 RTP 包接收,因此 进入时间戳 是进入 jitter buffer 的该帧最早的包,而发出 时间戳是 整个帧离开 jitter buffer 的时间。 此度量在样本或帧离开且完成其在缓冲区中的时间时递增(并 递增 jitterBufferEmittedCount)。 平均 jitter buffer 延迟可以通过将 jitterBufferDelay 除以 jitterBufferEmittedCount 来计算。

jitterBufferTargetDelay,类型为 double

每当 jitter buffer 发出一个 样本时,此值会增加目标 jitter buffer 延迟。所添加的目标是 在该样本从 jitter buffer 发出时的目标延迟,单位为秒。要获得平均目标延迟, 除以 jitterBufferEmittedCount

jitterBufferEmittedCount,类型为 unsigned long long

已从 jitter buffer 输出的 audio sample 或视频帧总数 (递增 jitterBufferDelay)。

jitterBufferMinimumDelay,类型为 double

jitter buffer 延迟可能会因各种原因增加到更高的 值,例如 为了实现 AV 同步,或者因为在 RTCRtpReceiver 上设置了 jitterBufferTarget。 使用其中一种机制时,跟踪本来可以达到的最小 jitter buffer 延迟可能很有用,这样 WebRTC 客户端就可以 跟踪所添加的额外延迟量。

此度量的工作方式与 jitterBufferTargetDelay 相同, 但它不受增加 jitter buffer 目标延迟的 外部机制影响,例如 jitterBufferTarget(见上方链接)、 AV sync 或任何其他机制。此度量纯粹基于网络 特征, 如 jitter 和丢包,并且可视为在没有 外部因素影响时可获得的最小 jitter buffer 延迟。 该度量会在每次 jitterBufferEmittedCount 更新时更新。

totalSamplesReceived,类型为 unsigned long long

对于视频,MUST NOT 存在。此 RTP stream 上已接收的样本总数。这包括 concealedSamples

concealedSamples,类型为 unsigned long long

对于视频,MUST NOT 存在。作为 concealed sample 的 样本总数。concealed sample 是在播放之前被本地生成的合成样本 替换的样本。必须进行 conceal 的样本示例 包括来自丢失包的样本(在 packetsLost 中报告),或来自到达 太晚而无法播放的包的样本(在 packetsDiscarded 中报告)。

silentConcealedSamples,类型为 unsigned long long

对于视频,MUST NOT 存在。所插入的 “silent” concealed samples 的总数。播放 silent samples 会产生静音或舒适噪声。 这是 concealedSamples 的一个子集。

concealmentEvents,类型为 unsigned long long

对于视频,MUST NOT 存在。concealment events 的数量。 每当在一个非 concealed sample 之后合成 concealed sample 时,此计数器递增。 也就是说,多个连续 concealed samples 会使 concealedSamples 计数增加多次, 但它们是一个 concealment event。

insertedSamplesForDeceleration,类型为 unsigned long long

对于视频,MUST NOT 存在。当播放 变慢时,此计数器会增加 接收样本数与播放样本数之间的差值。 如果通过插入样本实现播放变慢,则这将是插入 样本的数量。

removedSamplesForAcceleration,类型为 unsigned long long

对于视频,MUST NOT 存在。当播放 加快时,此计数器会增加 接收样本数与播放样本数之间的差值。 如果通过移除样本实现加速,则这将是被移除 样本的计数。

audioLevel, 类型为 double

对于视频,MUST NOT 存在。表示接收轨道的 音频电平。对于本地附加轨道的音频 电平,请改见 RTCAudioSourceStats

该值介于 0..1(线性)之间,其中 1.0 表示 0 dBov,0 表示 静音,0.5 大约表示相对于 0 dBov 的声压 级变化 6 dBSPL。

audioLevel 会在某个小时间间隔内求平均,使用 totalAudioEnergy 下描述的算法。 所使用的间隔是实现定义的

totalAudioEnergy,类型为 double

对于视频,MUST NOT 存在。表示接收轨道的 音频能量。对于本地附加轨道的 音频能量,请改见 RTCAudioSourceStats

此值 MUST 按如下方式计算:对于每个被接收的 audio sample (并因此由 totalSamplesReceived 计数), 将该样本的值除以最高强度可编码值、平方后再 乘以该样本的持续时间(秒)并累加。换言之, duration * Math.pow(energy/maxEnergy, 2)

这可用于获得与 audioLevel 使用相同单位的均方根(RMS)值, 如 [RFC6464] 中所定义。 可以使用公式 Math.sqrt(totalAudioEnergy/totalSamplesDuration) 将其转换为这些单位。 也可以使用两次不同 getStats() 调用的值之差执行此计算,以计算 任意所需时间间隔内的平均音频电平。换言之,执行 Math.sqrt((energy2 - energy1)/(duration2 - duration1))

例如,如果产生了 RMS 为 0.5(满量程为 1.0)的 10ms 音频包, 则应向 totalAudioEnergy 添加 0.5 * 0.5 * 0.01 = 0.0025。 如果接收到另一个 RMS 为 0.1 的 10ms 包, 则同样应向 totalAudioEnergy 添加 0.0001。 然后, Math.sqrt(totalAudioEnergy/totalSamplesDuration) 变为 Math.sqrt(0.0026/0.02) = 0.36,这与 对连续 20ms 音频片段执行 RMS 计算所获得的值相同。

如果使用多个音频声道,则 样本的音频能量指任一 声道的最高能量

totalSamplesDuration,类型为 double

对于视频,MUST NOT 存在。表示接收轨道的 音频持续时间。对于本地附加轨道的 音频持续时间,请改见 RTCAudioSourceStats

表示已接收的所有样本的总持续时间(秒) (并因此由 totalSamplesReceived 计数)。 可与 totalAudioEnergy 一起用于计算 不同时间间隔内的平均音频电平。

framesReceived,类型为 unsigned long

对于音频,MUST NOT 存在。表示 此 RTP stream 上接收到的完整帧总数。 此度量在完整帧被接收时递增。

decoderImplementation,类型为 DOMString

除非允许 暴露硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。标识所使用的 解码器实现。 这对于诊断互操作性问题很有用。

playoutId 的类型为 DOMString

对于视频,MUST NOT 存在。 如果正在进行音频播放,则它用于查找 对应的 RTCAudioPlayoutStats

powerEfficientDecoder,类型为 boolean

除非允许 暴露硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。 用户代理是否认为当前使用的解码器是电源 高效的。这 SHOULD 反映配置是否导致硬件加速, 但用户 代理在决定该配置是否被认为电源高效时 MAY 考虑其他信息。

framesAssembledFromMultiplePackets,类型为 unsigned long

对于音频,MUST NOT 存在。 它表示此 RTP stream 中由多个 RTP 包组成且正确解码的 帧总数。对于此类帧, totalAssemblyTime 会递增。平均帧组装时间可以通过将 totalAssemblyTime 除以 framesAssembledFromMultiplePackets 来计算。

totalAssemblyTime,类型为 double

对于音频,MUST NOT 存在。 每个视频帧从 第一个 RTP 包被接收的时间(接收时间戳)到 该帧的最后一个 RTP 包被接收的时间所花费时间的总和,单位为秒。 仅针对由多个 RTP 包组成的帧递增。

鉴于其中涉及的复杂性,到达时间或接收时间戳会尽可能 接近网络层测量。此度量不会因 未解码的帧而递增,即 framesDropped 或因其他原因 解码失败的帧(如果有)。仅针对由多个 RTP 包组成的帧递增。

retransmittedPacketsReceived,类型为 unsigned long long

为此 SSRC 接收的重传包总数。这是 packetsReceived 的一个子集。 如果未协商 RTX, 则无法识别重传包,并且此成员 MUST NOT 存在

retransmittedBytesReceived,类型为 unsigned long long

为此 SSRC 接收的 重传字节总数,仅包括 payload 字节。这是 bytesReceived 的一个子集。 如果未协商 RTX,则无法识别重传包,并且此成员 MUST NOT 存在

rtxSsrc 的类型为 unsigned long

如果在单独的 RTP stream 上为重传协商了 RTX,则这是 与此流的 ssrc 关联的 RTX stream 的 SSRC。 如果未协商 RTX,则此值 MUST NOT 存在

fecSsrc 的类型为 unsigned long

如果协商了使用单独 RTP stream 的 FEC 机制, 则这是与此流的 ssrc 关联的 FEC stream 的 SSRC。 如果未协商 FEC,或 FEC 使用相同的 RTP stream, 则此值 MUST NOT 存在

totalCorruptionProbability,类型为 double

对于音频,MUST NOT 存在。表示 为此 SSRC 所做的所有损坏 概率测量的累计和,关于此属性 SHOULD 何时存在,见 corruptionMeasurements

添加到 totalCorruptionProbability 的每个测量值 MUST 处于 [0.0, 1.0] 范围内, 其中值 0.0 表示系统估计处理后的帧中 没有或几乎没有 损坏。类似地,值 1.0 表示处理后的帧中 几乎肯定存在 可见损坏。介于两者之间的值表示 可能存在某些可见损坏,但例如其幅度可能较低,或 仅存在于帧的一小部分中。

损坏可能性值是估计值,而非保证。即使 估计值为 0.0,也可能存在损坏(即它是假阴性),例如只有 帧中非常小的区域受影响。类似地,即使估计值为 1.0, 也可能 不存在损坏(即它是假阳性),例如如果存在 QP 远高于帧平均值的 macroblocks。 就像 PSNR 测量等也存在边界情况一样,这些度量应主要 用作统计分析的基础,而不应作为 逐帧层面的绝对真相。

totalSquaredCorruptionProbability,类型为 double

对于音频,MUST NOT 存在。表示 为此 SSRC 所做的所有损坏 概率测量平方的累计和,关于此属性 SHOULD 何时存在,见 corruptionMeasurements

corruptionMeasurements,类型为 unsigned long long

对于音频,MUST NOT 存在。当用户 代理能够进行损坏 概率测量时,此计数器会为每次此类测量递增,并且 totalCorruptionProbabilitytotalSquaredCorruptionProbability 会分别用此测量值及测量值的平方进行 聚合。 如果 RTP 包中存在 corruption-detection 头扩展,则损坏 概率测量 MUST 存在

记录在 http://www.webrtc.org/experiments/rtp-hdrext/corruption-detection 的 corruption-detection 头扩展是 实验性的。其 标识符和格式可能会在 IETF 标准确立后发生变化。

RTCRemoteInboundRtpStreamStats 字典表示 远端端点对特定传入 RTP stream(对应于发送端点上的传出 RTP stream)的 测量度量。统计对象中报告的时间戳是 接收到对应 RTCP RR 的时间。

WebIDLdictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
             DOMString            localId;
             double               roundTripTime;
             double               totalRoundTripTime;
             double               fractionLost;
             unsigned long long   roundTripTimeMeasurements;
             unsigned long long   packetsWithBleachedEct1Marking;
};
localId,类型为 DOMString

localId 用于查找同一 SSRC 的本地 RTCOutboundRtpStreamStats 对象。

roundTripTime 的类型为 double

SSRC 的估计往返时间,基于 RTCP Receiver Report (RR) 中的 RTCP 时间戳 并以秒为单位测量。按 [RFC3550] 第 6.4.1 节中定义的方式计算。 在接收到 DLSR 值不为 0 的 RTCP Receiver Report 之前, MUST NOT 存在

totalRoundTripTime,类型为 double

表示自会话开始以来所有往返时间测量值的累计和,单位为秒。 各个往返时间基于 RTCP Receiver Report (RR) [RFC3550] 中的 RTCP 时间戳计算,因此 需要 DLSR 值不为 0。平均往返时间可以 通过将 totalRoundTripTime 除以 roundTripTimeMeasurements 来计算。

fractionLost 的类型为 double

为此 SSRC 报告的包丢失比例。按 [RFC3550] 第 6.4.1 节和附录 A.3 中定义的方式计算。

roundTripTimeMeasurements,类型为 unsigned long long

表示为此 SSRC 接收的、包含 有效往返时间的 RTCP RR 块总数。 如果由于尚未接收到 DLSR 值不为 0 的 RTCP Receiver Report 而无法 计算 roundTripTime, 则此计数器不会递增。

packetsWithBleachedEct1Marking,类型为 unsigned long long

按 [RFC3168] 第 3 节带有 ECT(1) 标记发送的包数量,但 [RFC8888] 报告给出的信息表明该包接收时的标记为 "not-ECT"。

8.7 RTCSentRtpStreamStats 字典

WebIDLdictionary RTCSentRtpStreamStats : RTCRtpStreamStats {
            unsigned long long packetsSent;
            unsigned long long bytesSent;
};

字典 RTCSentRtpStreamStats 成员

packetsSent,类型为 unsigned long long

为此 SSRC 发送的 RTP 包总数。这包括 重传。 按 [RFC3550] 第 6.4.1 节中定义的方式计算。

bytesSent,类型为 unsigned long long

为此 SSRC 发送的字节总数。这包括 重传。 按 [RFC3550] 第 6.4.1 节中定义的方式计算。

RTCOutboundRtpStreamStats 字典表示 传出 RTP stream 的测量度量。统计对象中报告的时间戳是 数据被采样的时间。

WebIDLdictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats {
             DOMString            mid;
             DOMString            mediaSourceId;
             DOMString            remoteId;
             DOMString            rid;
             unsigned long        encodingIndex;
             unsigned long long   headerBytesSent;
             unsigned long long   retransmittedPacketsSent;
             unsigned long long   retransmittedBytesSent;
             unsigned long        rtxSsrc;
             double               targetBitrate;
             unsigned long long   totalEncodedBytesTarget;
             unsigned long        frameWidth;
             unsigned long        frameHeight;
             double               framesPerSecond;
             unsigned long        framesSent;
             unsigned long        hugeFramesSent;
             unsigned long        framesEncoded;
             unsigned long        keyFramesEncoded;
             unsigned long long   qpSum;
             record<DOMString, double> psnrSum;
             unsigned long long   psnrMeasurements;
             double               totalEncodeTime;
             double               totalPacketSendDelay;
             RTCQualityLimitationReason                 qualityLimitationReason;
             record<DOMString, double> qualityLimitationDurations;
             unsigned long        qualityLimitationResolutionChanges;
             unsigned long        nackCount;
             unsigned long        firCount;
             unsigned long        pliCount;
             DOMString            encoderImplementation;
             boolean              powerEfficientEncoder;
             boolean              active;
             DOMString            scalabilityMode;
             unsigned long long   packetsSentWithEct1;
};
mid,类型为 DOMString

如果拥有此流的 RTCRtpTransceiver 具有一个不为 nullmid 值, 则这是该值;否则此成员 MUST NOT 存在

mediaSourceId,类型为 DOMString

表示当前附加到此流发送方的轨道的 stats object 的标识符,即一个 RTCMediaSourceStats

remoteId,类型为 DOMString

remoteId 用于查找同一 SSRC 的远端 RTCRemoteInboundRtpStreamStats 对象。

rid,类型为 DOMString

对于音频,MUST NOT 存在。 仅当为此 RTP stream 设置了 rid 时才存在。 如果设置了 rid, 则无论是否已协商 RID RTP 头扩展,此值都会存在。

encodingIndex,类型为 unsigned long

对于音频,MUST NOT 存在。 这是表示此 RTP stream 的 encoding 在 RTP 发送方的 encodings 列表中的索引。

headerBytesSent,类型为 unsigned long long

为此 SSRC 发送的 RTP 头和填充字节总数。这 不包括 IP 或 UDP 等传输层头的大小。 headerBytesSent + bytesSent 等于通过传输作为 payload 发送的字节数。

retransmittedPacketsSent,类型为 unsigned long long

为此 SSRC 重传的包总数。这是 packetsSent 的一个子集。 如果未协商 RTX,重传 包会通过此 ssrc 发送。如果协商了 RTX, 重传包会通过单独的 SSRC 发送,但仍会在此处计入。

retransmittedBytesSent,类型为 unsigned long long

为此 SSRC 重传的字节总数,仅包括 payload 字节。这是 bytesSent 的一个子集。如果 未协商 RTX,则重传字节会通过此 ssrc 发送。如果 协商了 RTX,重传字节会通过单独的 SSRC 发送,但仍会 在此处计入。

rtxSsrc 的类型为 unsigned long

如果在单独的 RTP stream 上为重传协商了 RTX,则这是 与此流的 ssrc 关联的 RTX stream 的 SSRC。 如果未协商 RTX,则此值 MUST NOT 存在

targetBitrate,类型为 double

反映当前编码器目标,单位为 bits per second。该 目标是一个瞬时值,反映编码器的 设置,但所得的每秒发送 payload 字节数 (不包括重传)SHOULD 与该 目标密切相关。另见 bytesSentretransmittedBytesSenttargetBitrate 的定义方式与 Transport Independent Application Specific (TIAS) bitrate [RFC3890] 相同。

totalEncodedBytesTarget,类型为 unsigned long long

对于音频,MUST NOT 存在。 每当一帧完成编码时,此值会增加目标帧大小(以字节为单位)。 实际帧大小可以大于或小于该数值。 每当 framesEncoded 增加时,此值都会增加。

frameWidth,类型为 unsigned long

对于音频,MUST NOT 存在。 表示最后编码帧的宽度。编码帧的分辨率 可以低于媒体源(见 RTCVideoSourceStats.width)。 在第一帧编码之前,此成员 MUST NOT 存在

frameHeight,类型为 unsigned long

对于音频,MUST NOT 存在。 表示最后编码帧的高度。编码帧的分辨率 可以低于媒体源(见 RTCVideoSourceStats.height)。 在第一帧编码之前,此成员 MUST NOT 存在

framesPerSecond,类型为 double

对于音频,MUST NOT 存在。 最近一秒内编码的帧数。这可以 低于媒体源帧率(见 RTCVideoSourceStats.framesPerSecond)。

framesSent,类型为 unsigned long

对于音频,MUST NOT 存在。 表示此 RTP stream 上发送的帧总数。

hugeFramesSent,类型为 unsigned long

对于音频,MUST NOT 存在。 表示此 RTP stream 发送的超大帧总数。按定义,超大帧是编码大小至少为 帧平均大小 2.5 倍的帧。帧的平均大小定义为 帧被编码时的每秒目标码率除以目标 FPS。 这些通常是画面中有大量变化、编码复杂的帧。 这可用于估计例如流式演示文稿中的幻灯片切换。

2.5 这个乘数是通过分析使用 WebRTC 独立实现的一个示例 演示文稿的编码帧大小而选择的。2.5 是一个相当大的 乘数,但仍能使所有幻灯片切换事件被识别为超大 帧。不过,它产生了 1.4% 的误报幻灯片切换检测, 这被认为是合理的。

framesEncoded,类型为 unsigned long

对于音频,MUST NOT 存在。 它表示为此 RTP 媒体流成功 编码的帧总数。

keyFramesEncoded,类型为 unsigned long

对于音频,MUST NOT 存在。 它表示为此 RTP 媒体流成功 编码的关键帧总数,例如 VP8 [RFC6386] 中的 key frames 或 H.264 [RFC6184] 中的 IDR-frames。 这是 framesEncoded 的一个子集。 framesEncoded - keyFramesEncoded 得到 已编码 delta frames 的数量。

qpSum,类型为 unsigned long long

对于音频,MUST NOT 存在。 此发送方编码的帧的 QP 值之和。 帧计数位于 framesEncoded 中。

QP 值的定义取决于编解码器;对于 VP8,QP 值是 帧头中作为语法元素 y_ac_qi 携带的值,并在 [RFC6386] 第 19.2 节中定义。 其范围是 0..127。

请注意,QP 值只是所使用量化器值的指示;许多 格式都有在帧内改变量化器值的方法。

psnrSum,类型为 record<DOMString, double>

除非允许暴露 硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。 此发送方编码的帧的 PSNR 值累计和。 该 record 包括 "y"、"u" 和 "v" 分量的值。 测量计数位于 psnrMeasurements 中。

PSNR 定义于 [ISO-29170-1:2017]。

PSNR 度量旨在用于统计分析,而非 表示逐帧层面的绝对真相。

psnrMeasurements,类型为 unsigned long long

除非允许暴露 硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。 PSNR 被测量的次数。psnrSum 的分量会 用此测量进行聚合。

PSNR 定义于 [ISO-29170-1:2017]。 PSNR 测量的频率是实现定义的

鼓励用户代理针对每个编码器实现以固定频率测量 PSNR, 并在不引入明显性能损耗的前提下尽可能频繁地 测量。

totalEncodeTime,类型为 double

对于音频,MUST NOT 存在。 编码此流的 framesEncoded 帧所花费的总秒数。平均编码时间可以通过将此 值除以 framesEncoded 来计算。 编码一帧所花的时间是 将一帧送入编码器与编码器返回该帧的编码 数据之间经过的时间。这不包括可能需要用于 将所得数据打包的任何额外时间。

totalPacketSendDelay,类型为 double

包在被发送到网络之前在本地缓冲中所花费的总秒数。 时间从包由 RTP packetizer 发出开始测量, 直到其被交给 OS 网络 socket 为止。当 packetsSent 递增时,此测量值会加到 totalPacketSendDelay 中。

qualityLimitationReason,类型为 RTCQualityLimitationReason

对于音频,MUST NOT 存在。 当前限制分辨率和/或 帧率的原因;如果未受限制,则为 "none"。

实现报告最具限制性的因素。如果 实现无法确定最具限制性的 因素,因为可能存在多个原因,则原因 MUST 按以下优先级顺序报告:"bandwidth"、 "cpu"、"other"。

CPU 和带宽资源的消耗 相互依赖且难以估算,因此很难 确定什么是“最具限制性的因素”。这里推荐的 优先级顺序基于这样一种启发式:"bandwidth" 通常变化更大,因此比 "cpu" 更可能且更 有用地作为信号。

qualityLimitationDurations,类型为 record<DOMString, double>

对于音频,MUST NOT 存在。 一个记录,表示此流在每种质量限制状态中 花费的总时间,单位为秒。该 record 包含所有 RTCQualityLimitationReason 类型的映射,包括 "none"。

所有条目的和减去 qualityLimitationDurations["none"] 得到该流受限制的总时间。

qualityLimitationResolutionChanges,类型为 unsigned long

对于音频,MUST NOT 存在。 由于质量受限(qualityLimitationReason 的值不是 "none")而导致分辨率发生变化的次数。 计数器初始为零,并在 分辨率升高或降低时增加。例如,如果 720p 轨道被作为 480p 发送了一段 时间,然后恢复到 720p,则 qualityLimitationResolutionChanges 的值将为 2。

nackCount,类型为 unsigned long

统计此发送方接收的 Negative ACKnowledgement (NACK) 包总数, 如 [RFC4585] 第 6.2.1 节中所定义。

firCount,类型为 unsigned long

对于音频,MUST NOT 存在。 统计此发送方接收的 Full Intra Request (FIR) 包总数, 如 [RFC5104] 第 4.3.1 节中所定义。不统计 [RFC2032] 中指出的 RTCP FIR, 它已被 [RFC4587] 废弃。

pliCount,类型为 unsigned long

对于音频,MUST NOT 存在。 统计此发送方接收的 Picture Loss Indication (PLI) 包总数,如 [RFC4585] 第 6.3.1 节中所定义

encoderImplementation,类型为 DOMString

除非允许暴露 硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。 标识所使用的编码器实现。 这对于诊断互操作性问题很有用。

powerEfficientEncoder,类型为 boolean

除非允许暴露 硬件,否则 MUST NOT 存在(这是一个指纹识别向量。)

对于音频,MUST NOT 存在。 当前使用的编码器是否被用户代理认为是电源高效的。 这 SHOULD 反映配置是否导致硬件 加速, 但用户代理在决定该配置是否被认为电源高效时 MAY 考虑其他信息。

active,类型为 boolean

指示此 RTP stream 是否被配置为 发送或禁用。 请注意,处于 active 的流仍可能不在发送,例如当受到 网络条件限制时。

scalabilityMode,类型为 DOMString

对于音频,MUST NOT 存在。 仅当当前为此 RTP stream 配置了 scalability mode 时才存在

packetsSentWithEct1,类型为 unsigned long long
为此 SSRC 发送的、带有 [RFC3168] 第 5 节定义并由 [RFC9331] 中描述的 L4S 协议使用的 ECT(1) 标记的 RTP 包总数。

8.9 RTCQualityLimitationReason 枚举

WebIDLenum RTCQualityLimitationReason {
            "none",
            "cpu",
            "bandwidth",
            "other",
          };
RTCQualityLimitationReason 枚举说明
枚举值 说明
none

分辨率和/或帧率未受限制。

cpu

分辨率和/或帧率主要由于 CPU 负载而受限。

bandwidth

分辨率和/或帧率主要由于带宽估计期间的拥塞信号而受限。 通常,拥塞控制算法会使用到达间隔时间、往返时间、包或 其他拥塞信号来执行带宽估计。

other

分辨率和/或帧率主要由于上述以外的原因而受限。

RTCRemoteOutboundRtpStreamStats 字典表示 远端 端点对其传出 RTP stream(对应于发送端点上的传出 RTP stream)的测量度量。统计对象中报告的时间戳是 接收到对应 RTCP SR 的时间。

WebIDLdictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats {
             DOMString           localId;
             DOMHighResTimeStamp remoteTimestamp;
             unsigned long long  reportsSent;
             double              roundTripTime;
             double              totalRoundTripTime;
             unsigned long long  roundTripTimeMeasurements;
};
localId,类型为 DOMString

localId 用于查找同一 SSRC 的本地 RTCInboundRtpStreamStats 对象。

remoteTimestamp,类型为 DOMHighResTimeStamp

remoteTimestamp, 类型为 DOMHighResTimeStamp [HIGHRES-TIME],表示远端端点发送这些 统计信息时的远端 时间戳。这不同于 timestamp,后者 表示统计信息由本地端点生成或接收的时间。 如果存在,remoteTimestamp 派生自 RTCP Sender Report(SR) 块中的 NTP 时间戳,该时间戳反映远端 端点的时钟。该时钟可能未与本地时钟同步。

reportsSent,类型为 unsigned long long

表示为此 SSRC 发送的 RTCP Sender Report(SR) 块总数。

roundTripTime 的类型为 double

SSRC 的估计往返时间,基于最新的包含 [RFC3611] 中定义的 DLRR 报告块的 RTCP Sender Report(SR)。 往返时间的计算定义于 [RFC3611] 第 4.5 节。 如果最新 SR 不包含 DLRR 报告块,或 DLRR 报告 块中的 last RR timestamp 为零,或 DLRR 报告块中的 delay since last RR 值为零,则 MUST NOT 存在

totalRoundTripTime,类型为 double

表示自会话开始以来所有往返时间测量值的累计和,单位为秒。 各个往返时间基于 RTCP Sender Report(SR) [RFC3611] 中的 DLRR 报告块计算。 如果无法计算 roundTripTime, 此计数器不会递增。 平均往返时间可以通过将 totalRoundTripTime 除以 roundTripTimeMeasurements 来计算。

roundTripTimeMeasurements,类型为 unsigned long long

表示为此 SSRC 接收的、包含可按照 [RFC3611] 推导出有效往返时间的 DLRR 报告块的 RTCP Sender Report(SR) 块总数。 如果无法计算 roundTripTime, 此计数器不会递增。

8.11 RTCMediaSourceStats 字典

RTCMediaSourceStats 字典表示当前 附加到一个或多个发送方的轨道。它包含关于媒体源的信息,例如 编码之前的帧率和分辨率。这是从 MediaStreamTrack 传递给 RTCRtpSender 的媒体。与之 相对的是 RTCOutboundRtpStreamStats,其 成员描述编码步骤之后测量得到的度量。例如,轨道可以从高分辨率摄像头 捕获,其帧因轨道约束而被降采样,然后又因 CPU 和网络条件被编码器进一步降采样。该字典反映 从轨道传出的 video frames 或 audio sample——是在应用轨道约束之后, 但在任何编码或进一步降采样发生之前。

媒体源对象属于子字典 RTCAudioSourceStatsRTCVideoSourceStats 中的一种。 type 相同 ("media-source"),但 kind 会根据轨道的种类而不同 ("audio""video")。

当轨道附加到任意 RTCRtpSender 时会创建 媒体源 stats object,并且在其生命周期中随后可以附加到多个发送方。 当该轨道不再附加到同一 RTCPeerConnection 的任何发送方时,此对象的生命周期结束。如果一个 媒体源对象已结束的轨道再次被附加,则会产生一个新的媒体源 stats object, 其计数器(例如帧数)会被重置。

WebIDLdictionary RTCMediaSourceStats : RTCStats {
             required DOMString       trackIdentifier;
             required DOMString       kind;
};

字典 RTCMediaSourceStats 成员

trackIdentifier,类型为 DOMString

MediaStreamTrackid 属性的值。

kind,类型为 DOMString

MediaStreamTrackkind 属性的值。 这要么是 "audio",要么是 "video"。如果 它是 "audio",则此 stats object 的类型为 RTCAudioSourceStats。如果 它是 "video",则此 stats object 的类型为 RTCVideoSourceStats

8.12 RTCAudioSourceStats 字典

RTCAudioSourceStats 字典表示附加 到一个或多个发送方的音频轨道。它是一个 RTCMediaSourceStats,其 kind"audio"

WebIDLdictionary RTCAudioSourceStats : RTCMediaSourceStats {
              double              audioLevel;
              double              totalAudioEnergy;
              double              totalSamplesDuration;
              double              echoReturnLoss;
              double              echoReturnLossEnhancement;
};

字典 RTCAudioSourceStats 成员

audioLevel,类型为 double

表示媒体源的音频电平。对于来自远端源的轨道的音频电平, 请改见 RTCInboundRtpStreamStats

该值介于 0..1(线性)之间,其中 1.0 表示 0 dBov,0 表示 静音,0.5 大约表示相对于 0 dBov 的声压 级变化 6 dBSPL。

audioLevel 会在某个小时间间隔内求平均,使用 totalAudioEnergy 下描述的算法。 所使用的间隔是实现定义的

totalAudioEnergy,类型为 double

表示媒体源的音频能量。对于来自远端源的轨道的音频能量, 请改见 RTCInboundRtpStreamStats

此值 MUST 按如下方式计算:对于 此 stats object 生命周期内由媒体源产生的每个 audio sample,将该样本的值 除以最高强度可编码值、平方后再乘以 该样本的持续时间(秒)并累加。换言之,duration * Math.pow(energy/maxEnergy, 2)

这可用于获得与 audioLevel 使用相同单位的均方根(RMS)值,如 [RFC6464] 中所定义。 可以使用公式 Math.sqrt(totalAudioEnergy/totalSamplesDuration) 将其转换为这些单位。 也可以使用两次不同 getStats() 调用的值之差执行此计算,以计算 任意所需时间间隔内的平均音频电平。换言之,执行 Math.sqrt((energy2 - energy1)/(duration2 - duration1))

例如,如果产生了 RMS 为 0.5(满量程为 1.0)的 10ms 音频包,则应向 totalAudioEnergy 添加 0.5 * 0.5 * 0.01 = 0.0025。 如果接收到另一个 RMS 为 0.1 的 10ms 包, 则同样应向 totalAudioEnergy 添加 0.0001。 然后, Math.sqrt(totalAudioEnergy/totalSamplesDuration) 变为 Math.sqrt(0.0026/0.02) = 0.36,这与 对连续 20ms 音频片段执行 RMS 计算所获得的值相同。

如果使用多个音频声道,则 样本的音频能量指任一 声道的最高能量

totalSamplesDuration,类型为 double

表示媒体源的音频持续时间。对于来自远端源的轨道的音频持续时间, 请改见 RTCInboundRtpStreamStats

表示此 stats object 生命周期内此源产生的所有样本的 总持续时间(秒)。可与 totalAudioEnergy 一起用于计算 不同时间间隔内的平均音频电平。

echoReturnLoss 的类型为 double

仅当 MediaStreamTrack 来源于应用了回声消除的麦克风时才存在。 以分贝计算,如 [ECHO] (2012) 第 3.14 节中所定义。

如果使用多个音频声道,则对于任一样本,考虑的是 音频能量最低的声道。

echoReturnLossEnhancement,类型为 double

仅当 MediaStreamTrack 来源于应用了回声消除的麦克风时才存在。 以分贝计算,如 [ECHO] (2012) 第 3.15 节中所定义。

如果使用多个音频声道,则对于任一样本,考虑的是 音频能量最低的声道。

8.13 RTCVideoSourceStats 字典

RTCVideoSourceStats 字典表示附加 到一个或多个发送方的视频轨道。它是一个 RTCMediaSourceStats,其 kind"video"

WebIDLdictionary RTCVideoSourceStats : RTCMediaSourceStats {
             unsigned long   width;
             unsigned long   height;
             unsigned long   frames;
             double          framesPerSecond;
};

字典 RTCVideoSourceStats 成员

width 的类型为 unsigned long

来自此源的最后一帧的宽度,以像素为单位。在产生 帧之前,此成员 MUST NOT 存在

height 的类型为 unsigned long

来自此源的最后一帧的高度,以像素为单位。在产生 帧之前,此成员 MUST NOT 存在

frames 的类型为 unsigned long

来自此源的帧总数。

framesPerSecond,类型为 double

最近一秒内测量的、来自此源的帧数。在此对象生命周期的 第一秒内,此成员 MUST NOT 存在

8.14 RTCAudioPlayoutStats 字典

仅在播放路径表示音频设备时适用。 表示一个播放路径——如果同一个 playout stats object 被多个 RTCInboundRtpStreamStats 引用,这 表明正在发生音频混合,在这种情况下,此 stats object 中的 sample 计数器指混合之后的 samples。

WebIDLdictionary RTCAudioPlayoutStats : RTCStats {
             required DOMString kind;
             double             synthesizedSamplesDuration;
             unsigned long      synthesizedSamplesEvents;
             double             totalSamplesDuration;
             double             totalPlayoutDelay;
             unsigned long long totalSamplesCount;
};

RTCAudioPlayoutStats 字典及其 所有度量都是 因缺乏共识而存在风险的特性。

字典 RTCAudioPlayoutStats 成员

kind,类型为 DOMString

对于音频播放,此值为 "audio"。这反映了正在播放的 MediaStreamTrack(s) 的 kind 属性。

synthesizedSamplesDuration,类型为 double

如果播放路径无法及时产生用于设备播放的音频样本, 则会合成样本来播放。 synthesizedSamplesDuration 以秒为单位测量, 并在此播放路径合成一个音频样本时递增。 此度量可以与 totalSamplesDuration 一起用于计算播放 媒体中被合成部分的百分比。

合成通常只会在管线 性能不足时发生。由 RTCInboundRtpStreamStats 合成的样本不在这里计数,而是在 RTCInboundRtpStreamStats.concealedSamples 中计数。

synthesizedSamplesEvents,类型为 unsigned long

synthesized samples events 的数量。每当在一个 non-synthesized sample 之后合成一个 sample 时,此计数器 递增。也就是说,多个连续 synthesized samples 会使 synthesizedSamplesDuration 递增多次,但它们是一个 synthesization samples event。

totalSamplesDuration,类型为 double

已播放的所有音频样本的总持续时间,以秒为单位。 包括 synthesized 和 non-synthesized samples。

totalPlayoutDelay,类型为 double

当音频样本被播放设备拉取时,此 计数器会增加该音频样本播放 路径的估计延迟。播放延迟包括 从被发出到设备上实际播放时间之间的 延迟。此度量可以与 totalSamplesCount 一起用于计算每个样本的平均播放延迟。

totalSamplesCount,类型为 unsigned long long

当音频样本被播放设备拉取时,此 计数器会增加为播放而发出的样本数。

8.15 RTCPeerConnectionStats 字典

WebIDLdictionary RTCPeerConnectionStats : RTCStats {
            unsigned long dataChannelsOpened;
            unsigned long dataChannelsClosed;
};

字典 RTCPeerConnectionStats 成员

dataChannelsOpened,类型为 unsigned long

表示在其生命周期中进入过 "open" 状态的唯一 RTCDataChannel 的数量。

dataChannelsClosed,类型为 unsigned long

表示在其生命周期中离开过 "open" 状态的唯一 RTCDataChannel 的数量(由于被任一端关闭或底层 传输被关闭)。从 "connecting" 过渡到 "closing" 或 "closed" 而从未处于 "open" 的 RTCDataChannel 不计入此数字。

任意时刻打开的数据通道总数可以计算为 dataChannelsOpened - dataChannelsClosed。 此数字始终为正。

8.16 RTCDataChannelStats 字典

WebIDLdictionary RTCDataChannelStats : RTCStats {
             DOMString           label;
             DOMString           protocol;
             unsigned short      dataChannelIdentifier;
             required RTCDataChannelState state;
             unsigned long       messagesSent;
             unsigned long long  bytesSent;
             unsigned long       messagesReceived;
             unsigned long long  bytesReceived;
};

字典 RTCDataChannelStats 成员

label,类型为 DOMString
RTCDataChannel 对象的 label 值。
protocol,类型为 DOMString
RTCDataChannel 对象的 protocol 值。
dataChannelIdentifier,类型为 unsigned short

RTCDataChannel 对象的 id 属性。

state,类型为 RTCDataChannelState
RTCDataChannel 对象的 readyState 值。
messagesSent,类型为 unsigned long

表示已发送的 API "message" 事件总数。

bytesSent,类型为 unsigned long long

表示在此 RTCDataChannel 上发送的 payload 字节总数。

messagesReceived,类型为 unsigned long

表示已接收的 API "message" 事件总数。

bytesReceived,类型为 unsigned long long

表示在此 RTCDataChannel 上接收的 payload 字节总数。

8.17 RTCTransportStats 字典

RTCTransportStats 对象表示与 RTCDtlsTransport 及其底层 RTCIceTransport 对应的 stats。使用 bundling 时,bundle group 中所有 MediaStreamTrack 都会使用单个 transport。 如果不使用 bundling,则不同的 MediaStreamTrack 会使用 不同的 transport。Bundling 在 [WEBRTC] 中描述。

WebIDLdictionary RTCTransportStats : RTCStats {
             unsigned long long    packetsSent;
             unsigned long long    packetsReceived;
             unsigned long long    bytesSent;
             unsigned long long    bytesReceived;
             RTCIceRole            iceRole;
             DOMString             iceLocalUsernameFragment;
             required RTCDtlsTransportState dtlsState;
             RTCIceTransportState  iceState;
             DOMString             selectedCandidatePairId;
             DOMString             localCertificateId;
             DOMString             remoteCertificateId;
             DOMString             tlsVersion;
             DOMString             dtlsCipher;
             RTCDtlsRole           dtlsRole;
             DOMString             srtpCipher;
             unsigned long         selectedCandidatePairChanges;
             unsigned long         ccfbMessagesSent;
	     unsigned long         ccfbMessagesReceived;
};

字典 RTCTransportStats 成员

packetsSent,类型为 unsigned long long

表示通过此 transport 发送的包总数。

packetsReceived,类型为 unsigned long long

表示在此 transport 上接收的包总数。

bytesSent,类型为 unsigned long long

表示在此 RTCIceTransport 上发送的 payload 字节总数, 即不包括头、填充 或 ICE 连通性检查。

bytesReceived,类型为 unsigned long long

表示在此 RTCIceTransport 上接收的 payload 字节总数, 即不包括头、填充 或 ICE 连通性检查。

iceRole,类型为 RTCIceRole

设置为底层 RTCDtlsTransport.iceTransportrole 属性的当前值。

iceLocalUsernameFragment,类型为 DOMString

设置为此 RTCIceTransport 在消息验证过程中使用的当前本地 username fragment [RFC5245]。 它可以在 setLocalDescription() 时和 ICE restart 时 更新。

dtlsState,类型为 RTCDtlsTransportState

设置为底层 RTCDtlsTransportstate 属性的当前值。

iceState,类型为 RTCIceTransportState

设置为底层 RTCIceTransportstate 属性的当前值。

selectedCandidatePairId,类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 transport 相关联的 RTCIceCandidatePairStats 的对象。

localCertificateId,类型为 DOMString

对于已协商 DTLS 的组件,给出本地证书。

remoteCertificateId,类型为 DOMString

对于已协商 DTLS 的组件,给出远端证书。

tlsVersion 的类型为 DOMString

对于已协商 DTLS 的组件,为已达成一致的 TLS 版本。仅在 DTLS 协商完成后 存在

如果存在,该值来自 ServerHello.supported_versions,否则 来自 ServerHello.version。它表示为四个大写的 十六进制数字,表示该版本的两个 字节。

dtlsCipher 的类型为 DOMString

用于 DTLS transport 的 cipher suite 的描述性名称,如 IANA cipher suite registry [IANA-TLS-CIPHERS] 的 "Description" 列中所定义。

dtlsRole 的类型为 RTCDtlsRole

根据 DTLS role,为 "client" 或 "server"。 在 DTLS 协商开始前为 "unknown"。

srtpCipher 的类型为 DOMString

用于 SRTP transport 的 protection profile 的描述性名称,如 IANA DTLS-SRTP protection profile registry [IANA-DTLS-SRTP] 的 "Profile" 列中所定义,并在 [RFC5764] 中进一步描述。

selectedCandidatePairChanges,类型为 unsigned long

此 transport 的 selected candidate pair 发生 变化的次数。从没有 selected candidate pair 变为拥有 selected candidate pair,或反过来,也会使此 计数器递增。其初始值为零,并在初始 candidate pair 被选中时变为一。

ccfbMessagesSent,类型为 unsigned long

在此 transport 上发送的、类型为 CongestionControl Feedback Packet 的 Transport-Layer Feedback Messages 的数量,如 [RFC8888] 第 3.1 节中所述。

ccfbMessagesReceived,类型为 unsigned long

在此 transport 上接收的、类型为 CongestionControl Feedback Packet 的 Transport-Layer Feedback Messages 的数量,如 [RFC8888] 第 3.1 节中所述。

RTCDtlsRole 枚举

WebIDLenum RTCDtlsRole {
      "client",
      "server",
      "unknown",
};
RTCDtlsRole 枚举说明
枚举值 说明
client

RTCPeerConnection 正作为 [RFC6347] 中定义的 DTLS client 运行。

server

RTCPeerConnection 正作为 [RFC6347] 中定义的 DTLS server 运行。

unknown

RTCPeerConnection 的 DTLS role 尚未确定。

8.18 RTCIceCandidateStats 字典

RTCIceCandidateStats 反映 [RFC5245] 第 15.1 节中 candidate 的属性。 它对应一个 RTCIceCandidate 对象。

WebIDLdictionary RTCIceCandidateStats : RTCStats {
             required DOMString       transportId;
             DOMString?               address;
             long                     port;
             DOMString                protocol;
             required RTCIceCandidateType candidateType;
             long                     priority;
             DOMString                url;
             RTCIceServerTransportProtocol relayProtocol;
             DOMString                foundation;
             DOMString                relatedAddress;
             long                     relatedPort;
             DOMString                usernameFragment;
             RTCIceTcpCandidateType   tcpType;
};

字典 RTCIceCandidateStats 成员

transportId 的类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 candidate 相关联的 RTCTransportStats 的对象。

address 的类型为 DOMString

它是 candidate 的地址,允许 IPv4 地址、IPv6 地址 和完全限定域名(FQDN)。详见 [RFC5245] 第 15.1 节。

用户代理应确保只暴露 Web 应用在对应 RTCPeerConnection 上配置过的远端 candidate 地址; 这对 peer reflexive remote candidates 尤其重要。默认情况下, 用户代理 MUST 在任何 remote candidate 的 RTCIceCandidateStats 字典中将 address 成员保留为 null。 一旦 RTCPeerConnection 实例通过 Web 应用使用 addIceCandidate() 获知某个地址, 用户代理就可以在对应 RTCPeerConnection 的、匹配新获知地址的任意 remote RTCIceCandidateStats 字典中暴露 'address' 成员值。

port,类型为 long

它是 candidate 的端口号。

protocol,类型为 DOMString

transport 的有效值是 "udp""tcp" 之一。基于 [RFC5245] 第 15.1 节中定义的 "transport"

candidateType,类型为 RTCIceCandidateType

此枚举在 [WEBRTC] 中定义。

priority,类型为 long

按 [RFC5245] 第 15.1 节中定义的方式计算。

url,类型为 DOMString

对于类型为 "srflx" 或类型为 "relay" 的本地 candidates,这是获得该 candidate 的 ICE server 的 URL, 并在 [WEBRTC] 中定义。

对于 remote candidates,此属性 MUST NOT 存在

relayProtocol,类型为 RTCIceServerTransportProtocol

它是端点用于与 TURN server 通信的协议。这仅对 local relay candidates 存在,并在 [WEBRTC] 中定义。

对于 remote candidates,此属性 MUST NOT 存在

foundation 的类型为 DOMString

[RFC5245] 第 15.1 节中定义的 ICE foundation。

relatedAddress 的类型为 DOMString

[RFC5245] 第 15.1 节中定义的 ICE rel-addr。仅为 serverreflexive、 peerreflexive 和 relay candidates 设置。

relatedPort 的类型为 long

[RFC5245] 第 15.1 节中定义的 ICE rel-addr。仅为 serverreflexive、 peerreflexive 和 relay candidates 设置。

usernameFragment 的类型为 DOMString

[RFC5245] 第 7.1.2.3 节中定义的 ICE username fragment。对于 peerreflexive remote candidates,除非 ICE username fragment 先前已被信令传递,否则不会设置。

tcpType,类型为 RTCIceTcpCandidateType

ICE candidate TCP 类型,如 RTCIceTcpCandidateType 中定义,并由 RTCIceCandidate 使用。

8.19 RTCIceCandidatePairStats 字典

WebIDLdictionary RTCIceCandidatePairStats : RTCStats {
             required DOMString            transportId;
             required DOMString            localCandidateId;
             required DOMString            remoteCandidateId;
             required RTCStatsIceCandidatePairState state;
             boolean                       nominated;
             unsigned long long            packetsSent;
             unsigned long long            packetsReceived;
             unsigned long long            bytesSent;
             unsigned long long            bytesReceived;
             DOMHighResTimeStamp           lastPacketSentTimestamp;
             DOMHighResTimeStamp           lastPacketReceivedTimestamp;
             double                        totalRoundTripTime;
             double                        currentRoundTripTime;
             double                        availableOutgoingBitrate;
             double                        availableIncomingBitrate;
             unsigned long long            requestsReceived;
             unsigned long long            requestsSent;
             unsigned long long            responsesReceived;
             unsigned long long            responsesSent;
             unsigned long long            consentRequestsSent;
             unsigned long                 packetsDiscardedOnSend;
             unsigned long long            bytesDiscardedOnSend;
};

字典 RTCIceCandidatePairStats 成员

transportId,类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 candidate pair 相关联的 RTCTransportStats 的对象。

localCandidateId,类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 candidate pair 相关联的 local candidate 的 RTCIceCandidateStats 的对象。

remoteCandidateId,类型为 DOMString

它是一个唯一标识符,关联到被检查以产生与此 candidate pair 相关联的 remote candidate 的 RTCIceCandidateStats 的对象。

state,类型为 RTCStatsIceCandidatePairState

表示一对 local 和 remote candidates 的 checklist 状态。

nominated,类型为 boolean

与 [RFC5245] 第 7.1.3.2.4 节中描述的 nominated flag 更新有关。

packetsSent,类型为 unsigned long long

表示在此 candidate pair 上发送的包总数。

packetsReceived,类型为 unsigned long long

表示在此 candidate pair 上接收的包总数。

bytesSent,类型为 unsigned long long

表示在此 candidate pair 上发送的 payload 字节总数,即 不包括头、填充或 ICE 连通性检查。

bytesReceived,类型为 unsigned long long

表示在此 candidate pair 上接收的 payload 字节总数, 即不包括头、填充或 ICE 连通性检查。

lastPacketSentTimestamp,类型为 DOMHighResTimeStamp

表示在此特定 candidate pair 上发送最后一个包时的 时间戳,不包括 STUN 包。

lastPacketReceivedTimestamp,类型为 DOMHighResTimeStamp

表示在此特定 candidate pair 上接收最后一个包时的 时间戳,不包括 STUN 包。

totalRoundTripTime,类型为 double

表示自会话开始以来所有往返时间测量值的总和,单位为秒, 基于 STUN 连通性检查 [STUN-PATH-CHAR] 响应(responsesReceived),包括那些响应 为验证 consent [RFC7675] 而发送的请求的响应。 平均往返时间可以通过将 totalRoundTripTime 除以 responsesReceived 来计算。

currentRoundTripTime,类型为 double

表示最新测得的往返时间,单位为秒,由 STUN 连通性检查 [STUN-PATH-CHAR] 计算得到, 包括那些为 consent 验证而发送的检查 [RFC7675]。

availableOutgoingBitrate,类型为 double

它由底层拥塞控制通过组合使用此 candidate pair 的所有传出 RTP stream 的可用 bitrate 计算得到。该 bitrate 测量不计算 IP 或其他传输层(如 TCP 或 UDP)的大小。它类似于 [RFC3890] 中定义的 TIAS, 即以 bits per second 测量,并且 bitrate 在 1 秒窗口上计算。 对于正在使用的 candidate pairs,该估计值通常不低于 在 lastPacketSentTimestamp 发送的包的 bitrate, 但可能更高。

仅当底层拥塞控制计算了 send-side bandwidth estimation, 例如使用 TWCC 等机制,或通过 RTCP 接收了 receive-side estimation, 例如 REMB 中描述的估计时,才存在。 对于从未用于发送会被纳入带宽估计的包的 candidate pairs, 或先前曾被使用但当前未被使用的 candidate pairs, MUST NOT 存在

availableIncomingBitrate,类型为 double

它由底层拥塞控制通过组合使用此 candidate pair 的所有传入 RTP stream 的可用 bitrate 计算得到。该 bitrate 测量不计算 IP 或其他传输层(如 TCP 或 UDP)的大小。它类似于 [RFC3890] 中定义的 TIAS, 即以 bits per second 测量,并且 bitrate 在 1 秒窗口上计算。 对于正在使用的 pair,该估计值通常不低于 在 lastPacketReceivedTimestamp 接收的包的 bitrate, 但可能更高。

仅当计算了 receive-side bandwidth estimation(例如 REMB) 时才存在。 对于从未用于接收会被纳入带宽估计的包的 candidate pairs, 或先前曾被使用但当前未被使用的 candidate pairs, MUST NOT 存在

requestsReceived,类型为 unsigned long long

表示接收的连通性检查请求总数(包括 重传)。接收方无法判断该请求是为检查 连通性还是检查 consent 而发送的,因此所有连通性 检查请求都会在这里计数。

requestsSent,类型为 unsigned long long

表示发送的连通性检查请求总数(不包括 重传)。

responsesReceived,类型为 unsigned long long

表示接收的连通性检查响应总数。

responsesSent,类型为 unsigned long long

表示发送的连通性检查响应总数。由于我们无法 区分连通性检查请求和 consent 请求,因此所有响应都会 被计数。

consentRequestsSent,类型为 unsigned long long

表示发送的 consent 请求总数。

packetsDiscardedOnSend,类型为 unsigned long

此 candidate pair 中因 socket 错误而被丢弃的包总数, 即将包交给 socket 时发生了 socket 错误。这 可能因各种原因发生,包括缓冲区已满或没有可用 内存。

bytesDiscardedOnSend,类型为 unsigned long long

此 candidate pair 中因 socket 错误而被丢弃的字节总数, 即将包含这些字节的包交给 socket 时发生了 socket 错误。这可能因各种原因发生,包括缓冲区已满或 没有可用内存。按 [RFC3550] 第 6.4.1 节中定义的方式计算。

8.19.1 RTCStatsIceCandidatePairState 枚举

WebIDLenum RTCStatsIceCandidatePairState {
    "frozen",
    "waiting",
    "in-progress",
    "failed",
    "succeeded"
};
RTCStatsIceCandidatePairState 枚举说明
枚举值 说明
frozen

定义于 [RFC5245] 第 5.7.4 节。

waiting

定义于 [RFC5245] 第 5.7.4 节。

in-progress

定义于 [RFC5245] 第 5.7.4 节。

failed

定义于 [RFC5245] 第 5.7.4 节。

succeeded

定义于 [RFC5245] 第 5.7.4 节。

8.20 RTCCertificateStats 字典

WebIDLdictionary RTCCertificateStats : RTCStats {
             required DOMString fingerprint;
             required DOMString fingerprintAlgorithm;
             required DOMString base64Certificate;
             DOMString issuerCertificateId;
};

字典 RTCCertificateStats 成员

fingerprint 的类型为 DOMString

证书的 fingerprint。仅使用 [RFC4572] 第 5 节中定义的 fingerprint 值。

fingerprintAlgorithm 的类型为 DOMString

用于计算证书 fingerprint 的哈希函数。例如 "sha-256"

base64Certificate 的类型为 DOMString

证书的 DER 编码 base-64 表示。

issuerCertificateId 的类型为 DOMString

issuerCertificateId 指向包含证书链中下一个 证书的 stats object。如果当前证书位于 链的末端(即自签名证书),则不会设置此值。

9. 示例

9.1 stats 应用示例

考虑这样一种情况:用户遇到糟糕的声音质量,而应用想要 判断其原因是否为丢包。可以使用以下示例代码:

var baselineReport, currentReport;
var sender = pc.getSenders()[0];

sender.getStats().then(function (report) {
    baselineReport = report;
})
.then(function() {
    return new Promise(function(resolve) {
        setTimeout(resolve, aBit); // ... 稍等一下
    });
})
.then(function() {
    return sender.getStats();
})
.then(function (report) {
    currentReport = report;
    processStats();
})
.catch(function (error) {
  console.log(error.toString());
});

function processStats() {
    // 将当前报告中的元素与基线比较
    for (let now of currentReport.values()) {
        if (now.type != "outbound-rtp")
            continue;

        // 从基线报告中获取对应的 stats
        let base = baselineReport.get(now.id);

        if (base) {
            remoteNow = currentReport.get(now.remoteId);
            remoteBase = baselineReport.get(base.remoteId);

            var packetsSent = now.packetsSent - base.packetsSent;
            var packetsReceived = remoteNow.packetsReceived - remoteBase.packetsReceived;

            // 如果 intervalFractionLoss > 0.3,我们可能已经找到了元凶
            var intervalFractionLoss = (packetsSent - packetsReceived) / packetsSent;
        }
    });
}

10. 安全和隐私考虑

WebRTC Statistics 暴露的数据包括 [GETUSERMEDIA] 和 [WEBRTC] 也暴露的大部分媒体和网络数据—— 因此,这些规范中与数据暴露相关的所有隐私和安全 考虑同样适用于本规范。

此外,RTCReceivedRtpStreamStatsRTCRemoteInboundRtpStreamStatsRTCSentRtpStreamStatsRTCOutboundRtpStreamStatsRTCRemoteOutboundRtpStreamStatsRTCIceCandidatePairStatsRTCTransportStats 所暴露的属性会暴露 当前 JavaScript 层无法获得的网络层数据。

除了如 WebRTC 1.0 规范中讨论的暴露 IP 地址所带来的风险之外,本规范唯一暴露的网络 属性的某些组合可以与位置相关联。

例如,RTCRemoteInboundRtpStreamStats 中暴露的 往返时间可以 粗略表明 peers 之间相距多远,因此,如果其中一个 peer 的位置已知,这可能会暴露另一个 peer 的信息。

当应用于 isolated streams 时,媒体度量可能允许应用推断该 isolated stream 的某些特征,例如是否有人正在说话(通过观察 audioLevel 统计)。

以下 stats 被视为敏感,并且对于 isolated media stream MUST NOT 报告:

A. 按类型汇总 WebRTC stats 字段

RTCStatsType 字典 字段
"codec" RTCStats timestamp
type
id
RTCCodecStats payloadType
transportId
mimeType
clockRate
channels
sdpFmtpLine
"inbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCReceivedRtpStreamStats packetsReceived
packetsReceivedWithEct1
packetsReceivedWithCe
packetsReportedAsLost
packetsReportedAsLostButRecovered
packetsLost
jitter
RTCInboundRtpStreamStats trackIdentifier
mid
remoteId
framesDecoded
keyFramesDecoded
framesRendered
framesDropped
frameWidth
frameHeight
framesPerSecond
qpSum
totalDecodeTime
totalInterFrameDelay
totalSquaredInterFrameDelay
pauseCount
totalPausesDuration
freezeCount
totalFreezesDuration
lastPacketReceivedTimestamp
headerBytesReceived
packetsDiscarded
fecBytesReceived
fecPacketsReceived
fecPacketsDiscarded
bytesReceived
nackCount
firCount
pliCount
totalProcessingDelay
estimatedPlayoutTimestamp
jitterBufferDelay
jitterBufferTargetDelay
jitterBufferEmittedCount
jitterBufferMinimumDelay
totalSamplesReceived
concealedSamples
silentConcealedSamples
concealmentEvents
insertedSamplesForDeceleration
removedSamplesForAcceleration
audioLevel
totalAudioEnergy
totalSamplesDuration
framesReceived
decoderImplementation
playoutId
powerEfficientDecoder
framesAssembledFromMultiplePackets
totalAssemblyTime
retransmittedPacketsReceived
retransmittedBytesReceived
rtxSsrc
fecSsrc
totalCorruptionProbability
totalSquaredCorruptionProbability
corruptionMeasurements
"outbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCSentRtpStreamStats packetsSent
bytesSent
RTCOutboundRtpStreamStats mid
mediaSourceId
remoteId
rid
encodingIndex
headerBytesSent
retransmittedPacketsSent
retransmittedBytesSent
rtxSsrc
targetBitrate
totalEncodedBytesTarget
frameWidth
frameHeight
framesPerSecond
framesSent
hugeFramesSent
framesEncoded
keyFramesEncoded
qpSum
psnrSum
psnrMeasurements
totalEncodeTime
totalPacketSendDelay
qualityLimitationReason
qualityLimitationDurations
qualityLimitationResolutionChanges
nackCount
firCount
pliCount
encoderImplementation
powerEfficientEncoder
active
scalabilityMode
packetsSentWithEct1
"remote-inbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCReceivedRtpStreamStats packetsReceived
packetsReceivedWithEct1
packetsReceivedWithCe
packetsReportedAsLost
packetsReportedAsLostButRecovered
packetsLost
jitter
RTCRemoteInboundRtpStreamStats localId
roundTripTime
totalRoundTripTime
fractionLost
roundTripTimeMeasurements
packetsWithBleachedEct1Marking
"remote-outbound-rtp" RTCStats timestamp
type
id
RTCRtpStreamStats ssrc
kind
transportId
codecId
RTCSentRtpStreamStats packetsSent
bytesSent
RTCRemoteOutboundRtpStreamStats localId
remoteTimestamp
reportsSent
roundTripTime
totalRoundTripTime
roundTripTimeMeasurements
"media-source" RTCStats timestamp
type
id
RTCMediaSourceStats trackIdentifier
kind
RTCAudioSourceStats audioLevel
totalAudioEnergy
totalSamplesDuration
echoReturnLoss
echoReturnLossEnhancement
RTCVideoSourceStats width
height
frames
framesPerSecond
"media-playout" RTCStats timestamp
type
id
RTCAudioPlayoutStats kind
synthesizedSamplesDuration
synthesizedSamplesEvents
totalSamplesDuration
totalPlayoutDelay
totalSamplesCount
"peer-connection" RTCStats timestamp
type
id
RTCPeerConnectionStats dataChannelsOpened
dataChannelsClosed
"data-channel" RTCStats timestamp
type
id
RTCDataChannelStats label
protocol
dataChannelIdentifier
state
messagesSent
bytesSent
messagesReceived
bytesReceived
"transport" RTCStats timestamp
type
id
RTCTransportStats packetsSent
packetsReceived
bytesSent
bytesReceived
iceRole
iceLocalUsernameFragment
dtlsState
iceState
selectedCandidatePairId
localCertificateId
remoteCertificateId
tlsVersion
dtlsCipher
dtlsRole
srtpCipher
selectedCandidatePairChanges
ccfbMessagesSent
ccfbMessagesReceived
"candidate-pair" RTCStats timestamp
type
id
RTCIceCandidatePairStats transportId
localCandidateId
remoteCandidateId
state
nominated
packetsSent
packetsReceived
bytesSent
bytesReceived
lastPacketSentTimestamp
lastPacketReceivedTimestamp
totalRoundTripTime
currentRoundTripTime
availableOutgoingBitrate
availableIncomingBitrate
requestsReceived
requestsSent
responsesReceived
responsesSent
consentRequestsSent
packetsDiscardedOnSend
bytesDiscardedOnSend
"local-candidate" RTCStats timestamp
type
id
RTCIceCandidateStats transportId
address
port
protocol
candidateType
priority
url
relayProtocol
foundation
relatedAddress
relatedPort
usernameFragment
tcpType
"remote-candidate" RTCStats timestamp
type
id
RTCIceCandidateStats transportId
address
port
protocol
candidateType
priority
url
relayProtocol
foundation
relatedAddress
relatedPort
usernameFragment
tcpType
"certificate" RTCStats timestamp
type
id
RTCCertificateStats fingerprint
fingerprintAlgorithm
base64Certificate
issuerCertificateId

B. 致谢

编辑者感谢工作组主席 Stefan Håkansson 以及 Team Contact Dominique Hazaël-Massieux 的支持。编辑者还要感谢 Bernard Aboba、Taylor Brandstetter、Henrik Boström、Jan-Ivar Bruaroey、Karthik Budigere、 Cullen Jennings 和 Lennart Schulte 对本规范作出的贡献。

C. 参考文献

C.1 规范性参考文献

[API-DESIGN-PRINCIPLES]
Web Platform Design Principles. Martin Thomson; Jeffrey Yasskin. W3C. 18 September 2025. W3C Working Group Note. URL: https://www.w3.org/TR/design-principles/
[ECHO]
Digital network echo cancellers. ITU-T G.168. ITU-T. Standard. URL: https://www.itu.int/rec/T-REC-G.168/en
[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 11 September 2025. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[HIGHRES-TIME]
High Resolution Time. Yoav Weiss. W3C. 7 November 2024. W3C Working Draft. URL: https://www.w3.org/TR/hr-time-3/
[IANA-DTLS-SRTP]
DTLS-SRTP Protection Profiles. IANA. URL: https://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
[IANA-MEDIA-TYPES]
Media Types. IANA. URL: https://www.iana.org/assignments/media-types/
[IANA-TLS-CIPHERS]
TLS Cipher Suite Registry. IANA. URL: https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[ISO-29170-1:2017]
Information technology — Advanced image coding and evaluation. ISO. URL: https://www.iso.org/standard/63637.html
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3168]
The Addition of Explicit Congestion Notification (ECN) to IP. K. Ramakrishnan; S. Floyd; D. Black. IETF. September 2001. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3168
[RFC3550]
RTP: A Transport Protocol for Real-Time Applications. H. Schulzrinne; S. Casner; R. Frederick; V. Jacobson. IETF. July 2003. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3550
[RFC3611]
RTP Control Protocol Extended Reports (RTCP XR). T. Friedman, Ed.; R. Caceres, Ed.; A. Clark, Ed. IETF. November 2003. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3611
[RFC3890]
A Transport Independent Bandwidth Modifier for the Session Description Protocol (SDP). M. Westerlund. IETF. September 2004. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3890
[RFC4572]
Connection-Oriented Media Transport over the Transport Layer Security (TLS) Protocol in the Session Description Protocol (SDP). J. Lennox. IETF. July 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4572
[RFC4585]
Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF). J. Ott; S. Wenger; N. Sato; C. Burmeister; J. Rey. IETF. July 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4585
[RFC5104]
Codec Control Messages in the RTP Audio-Visual Profile with Feedback (AVPF). S. Wenger; U. Chandra; M. Westerlund; B. Burman. IETF. February 2008. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5104
[RFC5226]
Guidelines for Writing an IANA Considerations Section in RFCs. T. Narten; H. Alvestrand. IETF. May 2008. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5226
[RFC5245]
Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols. J. Rosenberg. IETF. April 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5245
[RFC5764]
Datagram Transport Layer Security (DTLS) Extension to Establish Keys for the Secure Real-time Transport Protocol (SRTP). D. McGrew; E. Rescorla. IETF. May 2010. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5764
[RFC6184]
RTP Payload Format for H.264 Video. Y.-K. Wang; R. Even; T. Kristensen; R. Jesup. IETF. May 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6184
[RFC6347]
Datagram Transport Layer Security Version 1.2. E. Rescorla; N. Modadugu. IETF. January 2012. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6347
[RFC6386]
VP8 Data Format and Decoding Guide. J. Bankoski; J. Koleszar; L. Quillio; J. Salonen; P. Wilkins; Y. Xu. IETF. November 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6386
[RFC6464]
A Real-time Transport Protocol (RTP) Header Extension for Client-to-Mixer Audio Level Indication. J. Lennox, Ed.; E. Ivov; E. Marocco. IETF. December 2011. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6464
[RFC7002]
RTP Control Protocol (RTCP) Extended Report (XR) Block for Discard Count Metric Reporting. A. Clark; G. Zorn; Q. Wu. IETF. September 2013. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7002
[RFC7004]
RTP Control Protocol (RTCP) Extended Report (XR) Blocks for Summary Statistics Metrics Reporting. G. Zorn; R. Schott; Q. Wu, Ed.; R. Huang. IETF. September 2013. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7004
[RFC7656]
A Taxonomy of Semantics and Mechanisms for Real-Time Transport Protocol (RTP) Sources. J. Lennox; K. Gross; S. Nandakumar; G. Salgueiro; B. Burman, Ed. IETF. November 2015. Informational. URL: https://www.rfc-editor.org/rfc/rfc7656
[RFC7675]
Session Traversal Utilities for NAT (STUN) Usage for Consent Freshness. M. Perumal; D. Wing; R. Ravindranath; T. Reddy; M. Thomson. IETF. October 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7675
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8829]
JavaScript Session Establishment Protocol (JSEP). J. Uberti; C. Jennings; E. Rescorla, Ed. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8829
[RFC8888]
RTP Control Protocol (RTCP) Feedback for Congestion Control. Z. Sarker; C. Perkins; V. Singh; M. Ramalho. IETF. January 2021. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8888
[RFC9331]
The Explicit Congestion Notification (ECN) Protocol for Low Latency, Low Loss, and Scalable Throughput (L4S). K. De Schepper; B. Briscoe, Ed. IETF. January 2023. Experimental. URL: https://www.rfc-editor.org/rfc/rfc9331
[STUN-PATH-CHAR]
Discovery of path characteristics using STUN. T. Reddy; D. Wing; P. Martinsen; V. Singh. IETF. Internet Draft. URL: https://datatracker.ietf.org/doc/html/draft-reddy-tram-stun-path-data
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 13 March 2025. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/
[WEBRTC-IDENTITY]
Identity for WebRTC 1.0. Cullen Jennings; Martin Thomson. W3C. 27 September 2018. W3C Candidate Recommendation. URL: https://www.w3.org/TR/webrtc-identity/
[WEBRTC-PRIORITY]
WebRTC Priority Control API. Harald Alvestrand. W3C. 18 March 2021. W3C Candidate Recommendation. URL: https://www.w3.org/TR/webrtc-priority/
[XRBLOCK-STATS]
RTCP XR Metrics for WebRTC. Varun Singh; Rachel Huang; Roni Even; Dan Romascanu; Lingli Deng. IETF. Internet Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-xrblock-rtcweb-rtcp-xr-metrics

C.2 资料性参考文献

[RFC2032]
RTP Payload Format for H.261 Video Streams. T. Turletti; C. Huitema. IETF. October 1996. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2032
[RFC4587]
RTP Payload Format for H.261 Video Streams. R. Even. IETF. August 2006. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4587