读懂 WebRTC's Statistics API
# 场景
在调试 WebRTC 应用时,经常会查看 chrome 浏览器 chrome://webrtc-internals/
调试页面的调试信息。如下:
现在我们以 Peer connection 实例 (opens new window) 为例。
下面详细解读此页面的信息。
# 元信息
// 应用链接,创建 PeerConnection 是的配置信息(RTCConfiguration)
https://webrtc.github.io/samples/src/content/peerconnection/pc1/, { iceServers: [], iceTransportPolicy: all, bundlePolicy: balanced, rtcpMuxPolicy: require, iceCandidatePoolSize: 0, sdpSemantics: "unified-plan", extmapAllowMixed: true }
// ICE 连接状态的变化过程
ICE connection state: new => checking => connected
// PeerConnection 连接状态的变化过程
Connection state: new => connecting => connected
// PeerConnection 中 signaling 线程执行的状态变化
Signaling state: new => have-local-offer => stable
// ICE Candidate 配对的状况
ICE Candidate pair: 172.33.50.23:65226 <=> 172.33.50.23:56145
2
3
4
5
6
7
8
9
10
# ICE candidate grid
# RTCIceCandidatePair
RTCIceCandidatePair 描述了一对 ICE 候选者,它们共同构成了对两个 WebRTC 端点之间可行连接的描述。RTCIceCandidatePair 包含了 local 和 remote。
- local:描述连接本地端配置的 RTCIceCandidate。
- remote:描述连接远程端配置的 RTCIceCandidate。
每个 RTCIceCandidatePair 有一个 id。
参考:
# RTCIceCandidate
RTCIceCandidate 代表一个候选的交互式连接建立 (ICE,Interactive Connectivity Establishment) 配置,可用于建立 RTCPeerConnection。
ICE 候选描述了 WebRTC 能够与远程设备通信所需的协议和路由。当开始一个 WebRTC 对等连接时,通常连接的每一端都会提出一些候选者,直到他们相互同意一个描述他们认为最好的连接的候选者。 WebRTC 然后使用该候选人的详细信息来启动连接。
一个 RTCIceCandidatePair 包含了一对 RTCIceCandidate,分别属于 local 和 remote。即 Candidate type 分别为 local-candidate
和 remote-candidate
。
可以看到,在上述众多的协商的 RTCIceCandidatePair 中,只有一个 RTCIceCandidatePair 的状态是 succeeded
,其余的都是 waiting
,可见,在 ICE 协商中,PeerConnection 只选择一个 RTCIceCandidatePair,其余的 RTCIceCandidatePair 都置为 waiting
。另外,也只有被选择的 RTCIceCandidatePair 才会有相应的实时数据变化。
另外,从 W3C 的文档中,我们可以看到 RTCIceCandidatePair 可以具有如下的一些状态:
enum RTCStatsIceCandidatePairState {
"frozen",
"waiting",
"in-progress",
"failed",
"succeeded"
};
2
3
4
5
6
7
# 字段含义
其余的数据含义如下:
Network type / address
: 网络类型、地址。RTCIceCandidatePair 的网络为以太网;RTCIceCandidate 的地址。Port
:RTCIceCandidate 的端口。Protocol / candidate type
: RTCIceCandidatePair 使用的网络协议、RTCIceCandidate 的类型。RTCIceCandidatePair 使用 udp 协议;RTCIceCandidate 的类型为 host。(Pair) Priority
: RTCIceCandidatePair 的优先级。Bytes sent / received
: RTCIceCandidatePair 上行和下行的数据字节。STUN requests sent / responses received
: STUN 发送的请求数和收到的回应数。STUN requests received / responses sent
: STUN 收到的请求数和发送的回应数。RTT
: 来回通信延迟(Round-trip delay time),在通信(Communication)、电脑网络(Computer network)领域中,意指:在双方通信中,发讯方的信号(Signal)传播(Propagation)到收讯方的时间(意即:传播延迟(Propagation delay)),加上收讯方回传消息到发讯方的时间(如果没有造成双向传播速率差异的因素,此时间与发讯方将信号传播到收讯方的时间一样久)。Last update
: 最新更新同级数据的时间。
扩展
enum RTCIceCandidateType {
"host",
"srflx",
"prflx",
"relay"
};
2
3
4
5
6
RTCIceCandidate 的类型有如上四种。
参考:
- RTCIceCandidate - Web APIs | MDN (opens new window)
- Identifiers for WebRTC's Statistics API (opens new window)
- Round-trip delay - Wikipedia (opens new window)
# Time/Event 时间/事件列表
# 事件含义
下面我们按照事件发生的顺序
分析:
- transceiverAdded(添加 RTCRtpTransceiver)
Caused by: addTrack
getTransceivers()[0]:{
mid:null,
sender:{
track:'f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5',
streams:['zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE'],
},
receiver:{
track:'17079991-a6fc-49de-b53d-0614f5ac50bb',
streams:[],
},
direction:'sendrecv',
currentDirection:null,
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
什么是 RTCRtpTransceiver?
WebRTC 接口 RTCRtpTransceiver
描述了 RTCRtpSender
和 RTCRtpReceiver
的永久配对,以及一些共享状态。
每个 SDP 媒体段描述一个双向 SRTP(“安全实时协议,Secure Real Time Protocol”)流(RTCDataChannel
的媒体段除外)。这种发送和接收 SRTP 流的配对对于某些应用程序来说很重要,因此 RTCRtpTransceiver
用于表示这种配对,以及来自媒体段的其他重要状态。每个未禁用的 SRTP 媒体段总是由一个收发器(RTCRtpTransceiver)表示。
收发器使用其 mid 属性唯一标识,该属性与其对应的 m-line 的媒体 ID (mid) 相同。如果一个 RTCRtpTransceiver
的 mid 是非空的则,与一个 m-line 相关联;否则就不相连。
RTCPeerConnection.addTransceiver()
:
RTCPeerConnection
的方法 addTransceiver() 创建一个新的 RTCRtpTransceiver
并将其添加到与 RTCPeerConnection
关联的收发器集合中。每个收发器代表一个双向流,有一个 RTCRtpSender
和一个 RTCRtpReceiver
与之关联。
W3C
RTCRtpTransceiver 接口表示共享公共 mid 的 RTCRtpSender 和 RTCRtpReceiver 的组合。如JSEP 3.4.1中定义的,如果 RTCRtpTransceiver 的 mid 属性非空,则称其与媒体描述相关联,否则不相关。概念上说,一个被关联的收发器代表上一次会话描述中应用的收发器。
- sender:
RTCRtpSender
对象负责编码和发送数据到远程对等端。 - receiver:处理接收和解码传入媒体的
RTCRtpReceiver
对象。
参考:
- createOffer(创建 Offer)
// 以相应的配置创建 offer
options: {offerToReceiveVideo: 1, offerToReceiveAudio: 1, voiceActivityDetection: true, iceRestart: false}
2
negotiationneeded (需要 offer/answer 协商)
createOfferOnSuccess (type: "offer", 3 sections)(成功创建 Offer,offer 分为 3 段)
- setLocalDescription (type: "offer", 3 sections)(设置本地的会话描述,描述分为 3 段)
这里将上面创建的 offer 作为本地的会话描述。
setLocalDescriptionOnSuccess(成功设置了本地的会话描述)
signalingstatechange(信令状态已经改变)
// 信令状态变更
have-local-offer
2
如果 connection 的信令状态改变了,触发一个名为 signalingstatechange 的事件,此事件在 RTCPeerConnection 对象上触发,表示信令状态已改变。状态的改变原因是调用了 setLocalDescription 或 setRemoteDescription。
- transceiverModified(收发器被修改)
Caused by: setLocalDescription
getTransceivers()[0]:{
mid:'0',
sender:{
track:'f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5',
streams:['zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE'],
},
receiver:{
track:'17079991-a6fc-49de-b53d-0614f5ac50bb',
streams:[],
},
direction:'sendrecv',
currentDirection:null,
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
setLocalDescription 触发收发器被修改。注意,此时的 mid 变成了 '0',这说明该收发器已经与与媒体描述相关联。
- icegatheringstatechange(ICE 收集状态变更)
此事件在 RTCPeerConnection 对象上触发,表示 RTCPeerConnection 的ICE连接状态已改变。
- icecandidate (host)(接收到新的candidate)
sdpMid: 0, sdpMLineIndex: 0, candidate: candidate:2344440289 1 udp 2122260223 172.33.50.23 64147 typ host generation 0 ufrag yS7M network-id 2
此事件在 RTCPeerConnection 对象上触发,表示新的 RTCIceCandidate 已对脚本可见。
参数含义:
- DOMString类型的 candidate ,只读:它携带了[ICE]第15.1中定义的 candidate-attribute 。如果这个 RTCIceCandidate 代表了候选地址结束的指示, candidate 是一个空字符串。
- DOMString类型的 sdpMid ,只读,可空:如果不为 null ,它将包含RFC5888中定义的该候选地址关联的媒体组件中的媒体流"识别标签"。
- unsigned short类型的 sdpMLineIndex ,只读,可空:如果不为 null ,它表示该候选地址关联的SDP中媒体描述的索引值(从0开始)。
setRemoteDescription (type: "answer", 3 sections)(设置远端的会话描述,该描述分为3 节)
iceconnectionstatechange(ICE连接状态改变)
checking
该事件在 RTCPeerConnection 对象上触发,表示 RTCPeerConnection 的ICE连接状态已改变。
setRemoteDescriptionOnSuccess(成功设置远端会话描述)
signalingstatechange(信令状态已经改变)
stable
- iceconnectionstatechange
connected
- connectionstatechange
connecting
- icegatheringstatechange
complete
- connectionstatechange
connected
- addIceCandidate()
sdpMid: 0, sdpMLineIndex: 0, candidate: candidate:2344440289 1 udp 2122260223 172.33.50.23 60048 typ host generation 0 ufrag Aa8c network-id 2
2
RTCPeerConnection.addIceCandidate()
,当使用 RTCPeerConnection 的网站或应用程序通过其信令通道从远程对等方接收到新的 ICE 候选者时,它会通过调用 RTCPeerConnection.addIceCandidate() 将新接收到的候选者传递给浏览器的 ICE 代理。这会将这个新的远程候选添加到 RTCPeerConnection 的远程描述中,该描述描述了连接的远程端的状态。
- close
RTCPeerConnection.close() 方法关闭当前对等连接。
- connectionstatechange
closed
# Offer
Offer 具有如下的描述:
=> v=0 (6 more lines)
o=- 594927128365591396 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE
=> m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126 (34 more lines) mid=0
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:yS7M
a=ice-pwd:OdrjHcHv5i7uHAmdM58YvXMS
a=ice-options:trickle
a=fingerprint:sha-256 2B:E5:1B:34:8F:27:69:AF:91:1C:FB:17:B4:FD:FD:AA:11:B8:88:CB:A9:8B:CD:B1:5E:72:DF:E7:DD:2E:F2:B6
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:2506391311 cname:5hNpuIfTpUS1YL30
a=ssrc:2506391311 msid:zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5
=> m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 121 125 107 108 109 124 120 123 119 35 36 41 42 114 115 116 117 118 (129 more lines) mid=1
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:yS7M
a=ice-pwd:OdrjHcHv5i7uHAmdM58YvXMS
a=ice-options:trickle
a=fingerprint:sha-256 2B:E5:1B:34:8F:27:69:AF:91:1C:FB:17:B4:FD:FD:AA:11:B8:88:CB:A9:8B:CD:B1:5E:72:DF:E7:DD:2E:F2:B6
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE 7e7f7c52-d11a-4ee0-9c3e-743e490d0788
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=123
a=rtpmap:35 H264/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=fmtp:35 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:41 AV1/90000
a=rtcp-fb:41 goog-remb
a=rtcp-fb:41 transport-cc
a=rtcp-fb:41 ccm fir
a=rtcp-fb:41 nack
a=rtcp-fb:41 nack pli
a=rtpmap:42 rtx/90000
a=fmtp:42 apt=41
a=rtpmap:114 H264/90000
a=rtcp-fb:114 goog-remb
a=rtcp-fb:114 transport-cc
a=rtcp-fb:114 ccm fir
a=rtcp-fb:114 nack
a=rtcp-fb:114 nack pli
a=fmtp:114 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 red/90000
a=rtpmap:117 rtx/90000
a=fmtp:117 apt=116
a=rtpmap:118 ulpfec/90000
a=ssrc-group:FID 4091169142 3039037968
a=ssrc:4091169142 cname:5hNpuIfTpUS1YL30
a=ssrc:4091169142 msid:zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE 7e7f7c52-d11a-4ee0-9c3e-743e490d0788
a=ssrc:3039037968 cname:5hNpuIfTpUS1YL30
a=ssrc:3039037968 msid:zh3YAzJj9xjmrvkm0NbZ0V1ZEUPXZgYUOOhE 7e7f7c52-d11a-4ee0-9c3e-743e490d0788
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
详见协议/SDP协议。
# Stats Tables 实时变化的统计信息表
# RTCAudioSource
Statistics RTCAudioSource_5
timestamp 6/29/2022, 2:28:43 PM
trackIdentifier f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5
kind audio
audioLevel 0.13782158879360332
totalAudioEnergy 2.9554321642936476
[Audio_Level_in_RMS] 0.1339591782847916
totalSamplesDuration 189.92999999997224
echoReturnLoss 20
echoReturnLossEnhancement 2.6021299362182617
2
3
4
5
6
7
8
9
10
11
RTCMediaSourceStats 类型:
dictionary RTCMediaSourceStats : RTCStats { // 媒体源-帧速率和分辨率
required DOMString trackIdentifier; // MediaStreamTrack的id属性值
required DOMString kind; // MediaStreamTrack的kind属性的值。 这是“音频”或“视频”。
// 如果它是“音频”, 那么这个stats对象的类型是RTCAudioSourceStats。
// 如果它是“video”, 那么这个stats对象的类型是RTCVideoSourceStats
boolean relayedSource; // 源是远程的,例如如果它是通过 RTCPeerConnection 来自另一个主机,则为true。否则为假
};
2
3
4
5
6
7
RTCAudioSourceStats 类型:
dictionary RTCAudioSourceStats : RTCMediaSourceStats {
double audioLevel; // 媒体源的音频电平,0-1,其中1.0表示0 dBov,0表示静音,0.5表示声压级从0 dBov开始大约6dBSPL变化
double totalAudioEnergy; // 总音频能量
double totalSamplesDuration; // 媒体源的音频持续时间
double echoReturnLoss; // 回声返回损失,仅当 MediaStreamTrack 来自应用了回声消除的麦克风时才存在。 以分贝计算
double echoReturnLossEnhancement; // 回声回波损耗增强,仅当 MediaStreamTrack 来自应用了回声消除的麦克风时才存在。 以分贝计算
};
2
3
4
5
6
7
- trackIdentifier: MediaStreamTrack的id属性值。
- kind: MediaStreamTrack的kind属性的值。 这是“音频”或“视频”。
- audioLevel: 媒体源的音频电平,0.0-1.1区间,其中 1.0 表示 0 dBov,0 表示静音,0.5 表示声压级从 0 dBov开始变化大约 6dB SPL。
一个双精度浮点数,表示最近从 RTCRtpContributingSource 描述的源接收到的 RTP 数据包中的音频音量。
该值在 0.0 到 1.0 的范围内,呈线性比例,其值以 dBov 或分贝(过载)为单位定义。这是相对于开始发生音频削波的点的幅度。值 1.0 表示 0 dBov(最大音量),值 0.0 表示静音,值 0.5 表示声压级从 0 dBov 变化大约 6 dB SPL(声压级分贝)。
2
3
- totalAudioEnergy: 总音频能量。
- Audio_Level_in_RMS:
- totalSamplesDuration:媒体源的音频持续时间。
- echoReturnLoss: 回声返回损失,仅当 MediaStreamTrack 来自应用了回声消除的麦克风时才存在。 以分贝计算。
- echoReturnLossEnhancement:回声回波损耗增强,仅当 MediaStreamTrack 来自应用了回声消除的麦克风时才存在。 以分贝计算。
参考
# RTCVideoSource
Statistics RTCVideoSource_6
timestamp 6/29/2022, 2:37:11 PM
trackIdentifier 7e7f7c52-d11a-4ee0-9c3e-743e490d0788
kind video
width 640
height 480
frames 20945
framesPerSecond 30
2
3
4
5
6
7
8
9
RTCVideoSourceStats 类型:
dictionary RTCVideoSourceStats : RTCMediaSourceStats {
unsigned long width; // 宽
unsigned long height; // 高
unsigned long bitDepth; // 位深
unsigned long frames; // 总帧数
double framesPerSecond; // 最后一秒的编码帧数。这可能低于媒体源帧速率
};
2
3
4
5
6
7
- width:宽度。
- height:高度。
- frames:视频总帧数。
- framesPerSecond:最后一秒的编码帧数。这可能低于媒体源帧速率。
- bitDepth:视频位深。
参考:
# RTCCertificate 含义
// Statistics RTCCertificate_F4:D7:27:88:19:17:A8:8D:18:96:29:B5:AA:1D:B0:26:2A:07:D0:EA:22:5B:1D:CA:76:87:51:2F:3C:8A:26:86
timestamp 6/29/2022, 2:02:13 PM
fingerprint 2B:E5:1B:34:8F:27:69:AF:91:1C:FB:17:B4:FD:FD:AA:11:B8:88:CB:A9:8B:CD:B1:5E:72:DF:E7:DD:2E:F2:B6
fingerprintAlgorithm sha-256
base64Certificate MIIBFTCBvKADAgECAghfLDzRghfSqzAKBggqhkjOPQQDAjARMQ8wDQYDVQQDDAZXZWJSVEMwHhcNMjIwNjI4MDUwOTM3WhcNMjIwNzI5MDUwOTM3WjARMQ8wDQYDVQQDDAZXZWJSVEMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASVnJVVJkSTOphoqAW6SUC7sMT39KhVvybIrWbOiW3/swYurWI5XHj8YUbt8e2bFBsm1eMq3trabdKCt/jcndYPMAoGCCqGSM49BAMCA0gAMEUCIQCpPo7BLuZXGwOsd7reEXiuP0Tmb1eclimj1hJdx1+MYwIgCn2/VDncEPlGmVlV5lSaihsMhJ64GMar4gltQkT5Uew=
2
3
4
5
6
RTCCertificateStats:
dictionary RTCCertificateStats : RTCStats {
required DOMString fingerprint; // 证书的指纹
required DOMString fingerprintAlgorithm; // 用于计算证书指纹的哈希函数
required DOMString base64Certificate; // 证书的DER编码的base-64
DOMString issuerCertificateId; // 包含证书链中下一个证书的stats对象
};
2
3
4
5
6
- fingerprint:证书的指纹。
- fingerprintAlgorithm:用于计算证书指纹的哈希函数。
- base64Certificate:书的DER编码的base-64。
# RTCIceCandidate 含义
Statistics RTCIceCandidate_c6yMpJWD
timestamp 6/29/2022, 2:19:02 PM
transportId RTCTransport_0_1
isRemote true
ip 172.33.50.23
address 172.33.50.23
port 57778
protocol udp
candidateType host
priority 2122260223
2
3
4
5
6
7
8
9
10
11
RTCIceCandidateStats:
dictionary RTCIceCandidateStats : RTCStats {
required DOMString transportId; // 传输标识
DOMString? address; // 它是候选地址,允许使用IPv4地址、IPv6地址和完全限定域名
long port; // 候选人的端口号
DOMString protocol; // 协议传输的有效值是“udp”和“tcp”之一
required RTCIceCandidateType candidateType; // 候选人类型
long priority; // 优先级
DOMString url; // 对于本地候选人,这是从中获取候选人的ICE服务器的URL
DOMString relayProtocol; // 它是端点用于与TURN服务器通信的协议。这仅适用于本地候选人。
// 有效值为“udp”、“tcp”或“tls
};
2
3
4
5
6
7
8
9
10
11
- transportId:传输标识。
- isRemote:是否属于远端。
- ip:IPv4地址、IPv6地址。
- address:它是候选地址,允许使用IPv4地址、IPv6地址和完全限定域名。
- port:候选人的端口号。
- protocol:协议传输的有效值是“udp”和“tcp”之一。
- candidateType:候选人类型。
- priority:优先级。
- url:对于本地候选人,这是从中获取候选人的ICE服务器的URL。
# RTCIceCandidatePair 含义
Statistics RTCIceCandidatePair_yHl6guQU_c6yMpJWD
timestamp 6/29/2022, 2:19:02 PM
transportId RTCTransport_0_1
localCandidateId RTCIceCandidate_yHl6guQU
remoteCandidateId RTCIceCandidate_c6yMpJWD
state succeeded
priority 9115038255631187454
nominated true
writable true
packetsSent 195
[packetsSent/s] 20.93237148143175
packetsReceived 1205
[packetsReceived/s] 132.57168604906775
bytesSent 9389
[bytesSent_in_bits/s] 7352.246287954314
bytesReceived 719795
[bytesReceived_in_bits/s] 656032.4835832033
totalRoundTripTime 0.004
[totalRoundTripTime/responsesReceived] 0
currentRoundTripTime 0.001
availableOutgoingBitrate 300000
requestsReceived 7
requestsSent 1
responsesReceived 7
responsesSent 7
consentRequestsSent 6
packetsDiscardedOnSend 0
bytesDiscardedOnSend 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- transportId:传输标识。
- localCandidateId:本地候选人ID。
- remoteCandidateId:远端候选人状态。
- state:代表一对本地和远程候选者的清单状态。
- priority:优先级。
- nominated:与更新部分中描述的提名标志相关。
- writable:是否可写。
- packetsSent:在此候选对上发送的数据包总数。
- [packetsSent/s]:在此候选对上每秒发送的数据包总数。
- packetsReceived:在此候选对上接收到的数据包总数。
- [packetsReceived/s]:在此候选对上每秒接收到的数据包总数。
- bytesSent:此候选对上发送的有效载荷字节总数。
- [bytesSent_in_bits/s]:此候选对上每秒发送的有效载荷比特总数。
- bytesReceived:在此候选对上接收的有效载荷字节总数。
- [bytesReceived_in_bits/s]:在此候选对上每秒接收的有效载荷比特总数。
- totalRoundTripTime:自会话开始以来所有往返时间测量的总和(以秒为单位)。
- [totalRoundTripTime/responsesReceived]:每次相应的往返时间测量。
- currentRoundTripTime:以秒为单位的最新往返时间,由两个STUN连接检查[STUN-PATH-CHAR]计算得出。
- availableOutgoingBitrate:可用传出比特率-由底层拥塞控制通过使用此候选对组合所有传出 RTP 流的可用比特率来计算的。
- requestsReceived:收到的连接请求总数(包括重传)。
- requestsSent:发送的连接检查请求总数。
- responsesReceived: 收到的连接响应总数。
- responsesSent:发送的连接检查响应总数。
- consentRequestsSent:发送的同意请求总数。
- packetsDiscardedOnSend:由于套接字错误而被丢弃的此候选对的数据包总数。
- bytesDiscardedOnSend:由于套接字错误而被丢弃的此候选对的总字节数。
# RTCInboundRTPAudioStream 含义
Statistics RTCInboundRTPAudioStream_730260482
timestamp 6/29/2022, 2:19:02 PM
ssrc 730260482
kind audio
trackId RTCMediaStreamTrack_receiver_7
transportId RTCTransport_0_1
codecId RTCCodec_0_Inbound_111
[codec] opus (111, minptime=10;useinbandfec=1)
mediaType audio
jitter 0
packetsLost 0
packetsDiscarded 0
remoteId RTCRemoteOutboundRTPAudioStream_730260482
packetsReceived 464
[packetsReceived/s] 49.83897971769464
fecPacketsReceived 0
fecPacketsDiscarded 0
bytesReceived 40528
[bytesReceived_in_bits/s] 34161.63025769662
headerBytesReceived 12992
[headerBytesReceived_in_bits/s] 11163.931456763601
lastPacketReceivedTimestamp 1656483542436
[lastPacketReceivedTimestamp] 6/29/2022, 2:19:02 PM
jitterBufferDelay 16387.2
[jitterBufferDelay/jitterBufferEmittedCount_in_ms] 35
jitterBufferEmittedCount 444480
totalSamplesReceived 445760
[totalSamplesReceived/s] 48323.87473427673
concealedSamples 576
[concealedSamples/s] 0
[concealedSamples/totalSamplesReceived] 0
silentConcealedSamples 0
[silentConcealedSamples/s] 0
concealmentEvents 2
insertedSamplesForDeceleration 1785
[insertedSamplesForDeceleration/s] 0
removedSamplesForAcceleration 492
[removedSamplesForAcceleration/s] 0
audioLevel 0.01132236701559496
totalAudioEnergy 0.22607659102361047
[Audio_Level_in_RMS] 0.024382712400248877
totalSamplesDuration 9.299999999999846
estimatedPlayoutTimestamp 3865472342398
[estimatedPlayoutTimestamp] 6/28/2092, 2:19:02 PM
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# RTCInboundRTPVideoStream 含义
Statistics RTCInboundRTPVideoStream_115767491
timestamp 6/29/2022, 2:19:02 PM
ssrc 115767491
kind video
trackId RTCMediaStreamTrack_receiver_8
transportId RTCTransport_0_1
codecId RTCCodec_1_Inbound_96
[codec] VP8 (96)
mediaType video
jitter 0.009
packetsLost 0
packetsReceived 711
[packetsReceived/s] 81.73592673701921
bytesReceived 627667
[bytesReceived_in_bits/s] 583419.083693711
headerBytesReceived 17852
[headerBytesReceived_in_bits/s] 16203.649085816884
lastPacketReceivedTimestamp 1656483542438
[lastPacketReceivedTimestamp] 6/29/2022, 2:19:02 PM
jitterBufferDelay 8.548
[jitterBufferDelay/jitterBufferEmittedCount_in_ms] 33.566666666666656
jitterBufferEmittedCount 274
framesReceived 276
[framesReceived/s] 29.903387830616786
[framesReceived-framesDecoded] 1
frameWidth 320
frameHeight 240
framesPerSecond 30
framesDecoded 275
[framesDecoded/s] 29.903387830616786
keyFramesDecoded 1
[keyFramesDecoded/s] 0
framesDropped 0
totalDecodeTime 0.101
[totalDecodeTime/framesDecoded_in_ms] 0.16666666666666682
totalProcessingDelay 7.998
[totalProcessingDelay/framesDecoded_in_ms] 34.233333333333334
totalInterFrameDelay 9.127000000000008
[totalInterFrameDelay/framesDecoded_in_ms] 33.333333333333336
totalSquaredInterFrameDelay 0.30461900000000014
[interFrameDelayStDev_in_ms] 0.8692269873613643
decoderImplementation libvpx
firCount 0
pliCount 0
nackCount 0
qpSum 3500
[qpSum/framesDecoded] 10.166666666666666
estimatedPlayoutTimestamp 3865472342402
[estimatedPlayoutTimestamp] 6/28/2092, 2:19:02 PM
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# RTCMediaStreamTrack 含义
Statistics RTCMediaStreamTrack_receiver_7
timestamp 6/29/2022, 2:19:02 PM
trackIdentifier f5c0e6b4-e674-450a-bf7c-a2d82c16d8d5
remoteSource true
ended false
detached false
kind audio
jitterBufferDelay 16387.2
[jitterBufferDelay/jitterBufferEmittedCount_in_ms] 35
jitterBufferEmittedCount 444480
audioLevel 0.01132236701559496
totalAudioEnergy 0.22607659102361047
[Audio_Level_in_RMS] 0.024382712400248877
totalSamplesReceived 445760
totalSamplesDuration 9.299999999999846
concealedSamples 576
silentConcealedSamples 0
concealmentEvents 2
insertedSamplesForDeceleration 1785
removedSamplesForAcceleration 492
jitterBufferFlushes* 2
delayedPacketOutageSamples* 256
relativePacketArrivalDelay* 0.04
jitterBufferTargetDelay* 14937.6
interruptionCount* 0
totalInterruptionDuration* 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# RTCPeerConnection 含义
Statistics RTCPeerConnection
timestamp 6/29/2022, 2:24:01 PM
dataChannelsOpened 0
dataChannelsClosed 0
2
3
4
5
# RTCRemoteOutboundRTPAudioStream
Statistics RTCRemoteOutboundRTPAudioStream_730260482
timestamp 6/29/2022, 2:18:59 PM
ssrc 730260482
kind audio
transportId RTCTransport_0_1
codecId RTCCodec_0_Inbound_111
packetsSent 326
bytesSent 27996
localId RTCInboundRTPAudioStream_730260482
remoteTimestamp 1656483539696
[remoteTimestamp] 6/29/2022, 2:18:59 PM
reportsSent 2
roundTripTimeMeasurements 0
totalRoundTripTime 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# RTCTransport
Statistics RTCTransport_0_1
timestamp 6/29/2022, 2:19:02 PM
bytesSent 9389
[bytesSent_in_bits/s] 7352.246287954314
packetsSent 195
[packetsSent/s] 20.93237148143175
bytesReceived 719795
[bytesReceived_in_bits/s] 656032.4835832033
packetsReceived 1205
[packetsReceived/s] 132.57168604906775
dtlsState connected
selectedCandidatePairId RTCIceCandidatePair_yHl6guQU_c6yMpJWD
localCertificateId RTCCertificate_1F:47:0C:D2:8C:47:E3:41:4F:31:41:49:36:87:96:F9:A0:CB:0E:B1:08:40:03:EE:B8:3A:D5:C0:40:1E:DB:3C
remoteCertificateId RTCCertificate_EB:2C:A5:26:8C:F2:11:F2:34:B1:A8:77:7D:90:30:8E:57:BB:CB:0E:64:7D:40:9B:29:68:87:DE:2D:17:94:82
tlsVersion FEFD
dtlsCipher TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
dtlsRole client
srtpCipher AES_CM_128_HMAC_SHA1_80
selectedCandidatePairChanges 1
iceRole controlled
iceLocalUsernameFragment 2Es1
iceState connected
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Stats graphs for RTCAudioSource
# Stats graphs for RTCVideoSource
# Stats graphs for RTCIceCandidatePair
# Stats graphs for RTCMediaStreamTrack
# Stats graphs for RTCOutboundRTPAudioStream
# Stats graphs for RTCOutboundRTPVideoStream