Agora Web SDK 支持获取以下统计数据来检测通话质量:
请确保已在你的项目中实现基本的实时音视频功能。详见开始音视频通话或开始互动直播。
调用 Client.getSystemStats
方法获取系统信息。目前只能获取系统电量信息。
client.getSystemStats((stats) => {
console.log(`Current battery level: ${stats.BatteryLevel}`);
});
该功能处于实验阶段,浏览器兼容信息请参考 Battery Status API。
调用 Client.getTransportStats
方法[1]获取网络类型和网络连接状况统计数据[2]。具体参数如下:
NetworkType
:网络类型[3],如 Wi-Fi、蜂窝移动数据网络、蓝牙网络等。OutgoingAvailableBandwidth
:上行可用带宽估计(Kbps)。RTT
:Agora Web SDK 到 Agora SD-RTN 接入节点的平均往返延时( RTT,Round-Trip Time),单位 ms。setInterval(() => {
client.getTransportStats((stats) => {
console.log(`Current Transport RTT: ${stats.RTT}`);
console.log(`Current Network Type: ${stats.networkType}`);
console.log(`Current Transport OutgoingAvailableBandwidth: ${stats.OutgoingAvailableBandwidth}`);
});
}, 1000)
- [1] 本方法仅支持 Chrome 浏览器。
- [2] 部分统计数据可能耗费 0-3 秒时间返回。
- [3]
NetworkType
参数仅支持 Google Chrome 61 及之后版本,且无法保证兼容性,详见网络状况 API。
调用 Client.getSessionStats
方法获取与当前会话相关的统计数据,包括:
Duration
:在当前频道内的时长(秒)。RecvBitrate
:音视频总接收码率(Kbps),瞬间值。RecvBytes
:接收字节数,累计值。SendBitrate
:音视频总发送码率(Kbps),瞬间值。SendBytes
:发送字节数,累计值。UserCount
:通信场景下,该值为当前频道内的用户人数。直播场景下,如果本地用户为主播,该值为当前频道内的主播人数;如果本地用户为观众,该值为当前频道内的主播人数 + 1。setInterval(() => {
client.getSessionStats((stats) => {
console.log(`Current Session Duration: ${stats.Duration}`);
console.log(`Current Session UserCount: ${stats.UserCount}`);
console.log(`Current Session SendBytes: ${stats.SendBytes}`);
console.log(`Current Session RecvBytes: ${stats.RecvBytes}`);
console.log(`Current Session SendBitrate: ${stats.SendBitrate}`);
console.log(`Current Session RecvBitrate: ${stats.RecvBitrate}`);
});
}, 1000)
- 本方法仅支持 Chrome 浏览器。
- 统计数据可能耗费 0-3 秒时间返回。
调用以下方法获取本地发布流的音频和视频统计数据。
Client.getLocalAudioStats
方法提供本地发布流的音频统计数据,包括:CodecType
:音频编码类型。MuteState
:音频是否静音。RecordingLevel
:音频采集能量。SamplingRate
:音频采样率(kHz)。SendBitrate
:音频发送码率(Kbps)。SendLevel
:音频发送能量。setInterval(() => {
client.getLocalAudioStats((localAudioStats) => {
for(var uid in localAudioStats){
console.log(`Audio CodecType from ${uid}: ${localAudioStats[uid].CodecType}`);
console.log(`Audio MuteState from ${uid}: ${localAudioStats[uid].MuteState}`);
console.log(`Audio RecordingLevel from ${uid}: ${localAudioStats[uid].RecordingLevel}`);
console.log(`Audio SamplingRate from ${uid}: ${localAudioStats[uid].SamplingRate}`);
console.log(`Audio SendBitrate from ${uid}: ${localAudioStats[uid].SendBitrate}`);
console.log(`Audio SendLevel from ${uid}: ${localAudioStats[uid].SendLevel}`);
}
});
}, 1000)
Client.getLocalVideoStats
方法提供本地发布流的视频统计数据,一个 uid 对应一组数据,包括:CaptureFrameRate
:视频采集帧率(fps)。CaptureResolutionHeight
:视频采集分辨率高度,单位为像素。CaptureResolutionWidth
:视频采集分辨率宽度,单位为像素。EncodeDelay
:本地视频从采集到编码的延时(ms)。MuteState
:视频画面是否开启。SendBitrate
:视频发送码率(Kbps)。SendFrameRate
:视频发送帧率(fps)。SendResolutionHeight
:视频发送分辨率高度,单位为像素。SendResolutionWidth
:视频发送分辨率宽度,单位为像素。TargetSendBitrate
:setVideoProfile
中设置的目标发送码率(Kbps)。 TotalDuration
:从视频流发布到当前时间的总时长,单位为秒。TotalFreezeTime
:视频编码卡顿总时间,单位为秒。setInterval(() => {
client.getLocalVideoStats((localVideoStats) => {
for(var uid in localVideoStats){
console.log(`Video CaptureFrameRate from ${uid}: ${localVideoStats[uid].CaptureFrameRate}`);
console.log(`Video CaptureResolutionHeight from ${uid}: ${localVideoStats[uid].CaptureResolutionHeight}`);
console.log(`Video CaptureResolutionWidth from ${uid}: ${localVideoStats[uid].CaptureResolutionWidth}`);
console.log(`Video EncodeDelay from ${uid}: ${localVideoStats[uid].EncodeDelay}`);
console.log(`Video MuteState from ${uid}: ${localVideoStats[uid].MuteState}`);
console.log(`Video SendBitrate from ${uid}: ${localVideoStats[uid].SendBitrate}`);
console.log(`Video SendFrameRate from ${uid}: ${localVideoStats[uid].SendFrameRate}`);
console.log(`Video SendResolutionHeight from ${uid}: ${localVideoStats[uid].SendResolutionHeight}`);
console.log(`Video SendResolutionWidth from ${uid}: ${localVideoStats[uid].SendResolutionWidth}`);
console.log(`Video TargetSendBitrate from ${uid}: ${localVideoStats[uid].TargetSendBitrate}`);
console.log(`Video TotalDuration from ${uid}: ${localVideoStats[uid].TotalDuration}`);
console.log(`Video TotalFreezeTime from ${uid}: ${localVideoStats[uid].TotalFreezeTime}`);
}
});
}, 1000)
- 这两个方法仅支持 Chrome 浏览器。
- 统计数据可能耗费 0-3 秒返回。
获取远端订阅流的音频统计数据
Client.getRemoteAudioStats
方法提供远端订阅流的音频统计数据,一个 uid 对应一组数据,详见下表:参数 | 描述 |
---|---|
CodecType |
音频解码类型。 |
End2EndDelay |
端到端延时(ms),从远端采集音频到本地播放音频的延时。 图中阶段 1 + 2 + 3 + 4 + 5 + 6。 |
MuteState |
音频是否静音。 |
PacketLossRate |
远端音频的丢包率(%)。 |
RecvBitrate |
音频接收码率(Kbps)。 |
RecvLevel |
接收音频的音量。 |
TotalFreezeTime |
音频卡顿总时间(s)。 |
TotalPlayDuration |
音频播放总时长(s)。 |
TransportDelay |
传输延时(ms),从远端发送音频到本地接收音频的延时。 图中阶段 2 + 3 + 4。 |
setInterval(() => {
client.getRemoteAudioStats((remoteAudioStatsMap) => {
for(var uid in remoteAudioStatsMap){
console.log(`Audio CodecType from ${uid}: ${remoteAudioStatsMap[uid].CodecType}`);
console.log(`Audio End2EndDelay from ${uid}: ${remoteAudioStatsMap[uid].End2EndDelay}`);
console.log(`Audio MuteState from ${uid}: ${remoteAudioStatsMap[uid].MuteState}`);
console.log(`Audio PacketLossRate from ${uid}: ${remoteAudioStatsMap[uid].PacketLossRate}`);
console.log(`Audio RecvBitrate from ${uid}: ${remoteAudioStatsMap[uid].RecvBitrate}`);
console.log(`Audio RecvLevel from ${uid}: ${remoteAudioStatsMap[uid].RecvLevel}`);
console.log(`Audio TotalFreezeTime from ${uid}: ${remoteAudioStatsMap[uid].TotalFreezeTime}`);
console.log(`Audio TotalPlayDuration from ${uid}: ${remoteAudioStatsMap[uid].TotalPlayDuration}`);
console.log(`Audio TransportDelay from ${uid}: ${remoteAudioStatsMap[uid].TransportDelay}`);
}
});
}, 1000)
获取远端订阅流的视频统计数据
Client.getRemoteVideoStats
方法提供远端订阅流的视频统计数据,一个 uid 对应一组数据,详见下表:参数 | 描述 |
---|---|
End2EndDelay |
端到端延时(ms),从远端采集视频到本地播放视频的延时。 图中阶段 1 + 2 + 3 + 4 + 5 + 6。 |
MuteState |
视频画面是否开启。 |
PacketLossRate |
远端视频的丢包率(%)。 |
RecvBitrate |
视频接收码率(Kbps)。 |
RecvResolutionHeight |
视频接收分辨率高度,单位为像素。 |
RecvResolutionWidth |
视频接收分辨率宽度,单位为像素。 |
RenderFrameRate |
渲染帧率(fps),视频解码输出帧率。 |
RenderResolutionHeight |
视频渲染分辨率高度,单位为像素。 |
RenderResolutionWidth |
视频渲染分辨率宽度,单位为像素。 |
TotalFreezeTime |
视频卡顿总时间,单位为秒。 |
TotalPlayDuration |
视频播放总时间,单位为秒。 |
TransportDelay |
传输延时(ms),从远端发送视频到本地接收视频的延时。 图中阶段 2 + 3 + 4。 |
setInterval(() => {
client.getRemoteVideoStats((remoteVideoStatsMap) => {
for(var uid in remoteVideoStatsMap){
console.log(`Video End2EndDelay from ${uid}: ${remoteVideoStatsMap[uid].End2EndDelay}`);
console.log(`Video MuteState from ${uid}: ${remoteVideoStatsMap[uid].MuteState}`);
console.log(`Video PacketLossRate from ${uid}: ${remoteVideoStatsMap[uid].PacketLossRate}`);
console.log(`Video RecvBitrate from ${uid}: ${remoteVideoStatsMap[uid].RecvBitrate}`);
console.log(`Video RecvResolutionHeight from ${uid}: ${remoteVideoStatsMap[uid].RecvResolutionHeight}`);
console.log(`Video RecvResolutionWidth from ${uid}: ${remoteVideoStatsMap[uid].RecvResolutionWidth}`);
console.log(`Video RenderFrameRate from ${uid}: ${remoteVideoStatsMap[uid].RenderFrameRate}`);
console.log(`Video RenderResolutionHeight from ${uid}: ${remoteVideoStatsMap[uid].RenderResolutionHeight}`);
console.log(`Video RenderResolutionWidth from ${uid}: ${remoteVideoStatsMap[uid].RenderResolutionWidth}`);
console.log(`Video TotalFreezeTime from ${uid}: ${remoteVideoStatsMap[uid].TotalFreezeTime}`);
console.log(`Video TotalPlayDuration from ${uid}: ${remoteVideoStatsMap[uid].TotalPlayDuration}`);
console.log(`Video TransportDelay from ${uid}: ${remoteVideoStatsMap[uid].TransportDelay}`);
}
});
}, 1000)
- 这两个方法仅支持 Chrome 浏览器。
- 统计数据可能耗费 0-3 秒返回。
Agora Web SDK 通过 Client.on
中的 network-quality
回调向 App 报告本地用户的上下行网络质量。该回调每 2 秒触发,返回的参数包括:
downlinkNetworkQuality
:下行网络质量打分。uplinkNetworkQuality
:上行网络质量打分。质量打分对照表如下:
分数 | 说明 |
---|---|
0 | 网络质量未知。 |
1 | 网络质量极好。 |
2 | 用户主观感觉和极好差不多,但码率可能略低于极好。 |
3 | 用户主观感受有瑕疵但不影响沟通。 |
4 | 勉强能沟通但不顺畅。 |
5 | 网络质量非常差,基本不能沟通。 |
6 | 完全无法沟通。 |
client.on("network-quality", function(stats) {
console.log("downlinkNetworkQuality", stats.downlinkNetworkQuality);
console.log("uplinkNetworkQuality", stats.uplinkNetworkQuality);
});
该功能目前处于实验阶段,网络质量评分仅供参考。
Agora Web SDK 通过 Client.on
中的 exception
回调通知 App 频道内的异常事件。异常事件不是错误,但是往往会引起通话质量问题。发生异常事件后,如果恢复正常,也会收到该回调。该回调返回:
code
:事件码。msg
:提示消息。uid
:发生异常或恢复的用户 UID。client.on("exception", function(evt) {
console.log(evt.code, evt.msg, evt.uid);
})
每一个异常事件都有对应的恢复事件,详见下表:
本回调仅支持 Chrome 浏览器。
上述所有方法必须在成功加入频道之后调用。