文档反馈
文档反馈

通话中质量监测

在通话场景中,开发者经常需要了解当前通话的通话质量、设备状态等信息,监测通话的整体体验;也可将部分质量数据在 UI 层面展示给用户,使用户能够及时了解当前通话的整体质量。

NERTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。

上下行网络质量同步

onNetworkQuality 回调向您同步当前通话中每个成员的上下行网络质量。

注意

统计信息同步

onRtcStats 回调向您同步本地通话统计信息。其中包含通话时长、当前通话频道中的人数、当前系统的 CPU 使用率、当前 App 的 CPU 使用率等重要数据。

参数 描述
cpu_app_usage、cpu_idle_usage、cpu_total_usage App 的 CPU 使用率、系统的 CPU 空闲率和系统的 CPU 使用率。
memory_app_usage、memory_app_kbytes、memory_total_usage App的内存使用率、内存使用量、系统的内存使用率
total_duration 通话总时长(秒)。
tx_bytes/rx_bytes 累计发送/接收字节数。
tx_audio_bytes/rx_audio_bytes 音频发送/接收字节数。
tx_video_bytes/rx_video_bytes 视频发送/接收字节数。
tx_audio_kbitrate/rx_audio_kbitrate 音频接收/发送码率,单位为 kbps。
tx_video_kbitrate/rx_video_kbitrate 视频接收/发送码率,单位为 kbps。
up_rtt/down_rtt 上行/下行平均往返时延,单位为毫秒。
tx_audio_packet_loss_rate/rx_audio_packet_loss_rate 本地上行/下行音频实际丢包率。
tx_audio_packet_loss_sum/rx_audio_packet_loss_sum 本地上行/下行音频实际丢包数。
tx_audio_jitter/rx_audio_jitter 本地上行/下行音频抖动计算,单位为毫秒。
tx_video_jitter/rx_video_jitter 本地上行/下行视频抖动计算,单位为毫秒。
tx_video_packet_loss_rate/rx_video_packet_loss_rate 本地上行/下行视频实际丢包率。
tx_video_packet_loss_sum/rx_video_packet_loss_sum 本地上行/下行视频实际丢包数。

音频质量同步

本地音频流统计信息同步

onLocalAudioStats 回调向您同步本地设备发送音频流的统计信息。包括当前通话声道数(单声道或双声道)、发送音频的采样率和发送音频的码率。SDK 会每隔 2 秒自动触发本回调。

参数 描述
num_channels 当前采集的声道数。
sent_sample_rate 统计周期内本地上行音频采样率,单位为 Hz。
sent_bitrate 统计周期内发送码率的平均值,单位为 Kbps。
audio_loss_rate 特定时间内的音频丢包率。
rtt 平均往返时延(RTT)。
volume 音量,范围为 0 ~ 100。

远端音频流统计信息同步

onRemoteAudioStats 回调向您同步当前通话中每个远端用户音频流的统计信息。包括每个远端用户发送的音频流质量、声道数等信息。每隔 2 秒您会收到频道内所有远端用户的网络质量同步。

参数 描述
uid 用户 ID,指定是哪个用户的音频流。
received_bitrate 统计周期内接收到的码率平均值,单位为 Kbps。
total_frozen_time 远端用户在加入房间后发生音频卡顿的累计时长 (ms)。一个统计周期内,音频丢帧率达到 4% 即记为一次音频卡顿。
frozen_rate 远端用户下行音频平均卡顿率。其值为远端用户在加入房间后发生音频卡顿的累计时长占音频总有效时长的百分比。
audio_loss_rate 统计周期内的远端音频流的丢帧率。
volume 音量,范围为 0 ~ 100。

视频质量同步

本地视频流统计信息同步

onLocalVideoStat(s) 回调向您同步本地设备发送视频流的统计信息。您可以了解视频编码宽/高等信息。SDK 会每隔 2 秒自动触发本回调。

如果您此前调用 enableDualStreamMode 方法开启双流模式,则本回调描述本地设备发送的视频大流的统计信息。

参数 描述
layer_type 视频流通道类型。 1:主流;2:辅流。
width 视频编码宽度,单位为 px。
height 视频编码高度,单位为 px。
capture_frame_rate 视频采集帧率,单位为 fps。
render_frame_rate 视频渲染帧率,单位为 fps。
encoder_frame_rate 编码帧率,单位为 fps。
sent_frame_rate 实际发送帧率,单位为 fps,不包含丢包后重传视频等的发送帧率。
sent_bitrate 实际发送码率,单位为 Kbps,不包含丢包后重传视频等的发送码率。
target_bitrate 当前编码器的目标编码码率,单位为 Kbps,该码率为 SDK 根据当前网络状况预估的一个值。
encoder_bitrate 编码器实际编码码率,单位为 Kbps。
codec_name 视频编码器名字。

远端视频流统计信息同步

onRemoteVideoStats 回调向您同步当前通话中每个远端用户/主播的视频流的统计信息。包括每个远端用户的视频宽/高等其他参数信息。SDK 会每隔 2 秒自动触发本回调。

参数 描述
layer_type 视频流通道类型。 1:主流;2:辅流。
width 远端视频编码宽度,单位为 px。
height 远端视频编码高度,单位为 px。
received_bitrate 接收到的码率(Kbps)。
received_frame_rate 接收到的帧率 (fps)。
decoder_frame_rate 解码帧率 (fps)。
render_frame_rate 渲染帧率 (fps)。
packet_loss_rate 远端视频下行丢包率。
total_frozen_time 远端用户加入房间后,其下行视频卡顿累计时长(ms)。
frozen_rate 远端用户加入房间后,其下行视频平均卡顿率,其值为视频卡顿的累计时长占视频总有效时长的百分比。
codec_name 视频编码器名字。

Android

实现方式

示例代码

NERtc.getInstance().setStatsObserver(NERtcStatsObserver)

API参考

功能描述
NERtcStatsObserver 统计信息回调类
事件 功能描述
onRtcStats 当前通话统计回调
onLocalAudioStats 本地音频流统计信息回调
onRemoteAudioStats 远端音频流的统计信息回调
onLocalVideoStats 本地视频流统计信息回调
onRemoteVideoStats 远端视频流的统计信息回调
onNetworkQuality 所有用户的网络状态回调

iOS

实现方式

示例代码

// 添加添加 media 统计信息观测者
NERtcEngine *coreEngine = [NERtcEngine sharedEngine];
[coreEngine addEngineMediaStatsObserver:<#observer#>];

//////

/**
observer.m 信息观测者实现代理方法
*/

- (void)onRtcStats:(NERtcStats *)stat {
    // 当前通话统计回调
}

- (void)onLocalAudioStat:(NERtcAudioSendStats *)stat {
    // 本地音频流统计信息回调
}

- (void)onRemoteAudioStats:(NSArray<NERtcAudioRecvStats*> *)stats {
    // 本地音频流统计信息回调
}

- (void)onLocalVideoStat:(NERtcVideoSendStats *)stat {
    // 本地视频流统计信息回调
}

- (void)onRemoteVideoStats:(NSArray<NERtcVideoRecvStats*> *)stats {
    // 通话中远端视频流的统计信息回调
}

- (void)onNetworkQuality:(NSArray<NERtcNetworkQualityStats *> *)stats {
    // 通话中每个用户的网络上下行质量同步回调
}

API参考

方法 事件描述
addEngineMediaStatsObserver 添加 media 统计信息观测器
removeEngineMediaStatsObserver 删除 media 统计信息观测器
cleanupEngineMediaStatsObserver 清空 media 统计信息观测器
事件 事件描述
onRemoteAudioStats 通话中远端音频流的统计信息回调
onRtcStats 当前通话统计回调
onNetworkQuality 通话中每个用户的网络上下行质量同步回调
onLocalAudioStat 本地音频流统计信息回调
onLocalVideoStat 本地视频流统计信息回调
onRemoteVideoStats 通话中远端视频流的统计信息回调

Windows/macOS

实现方式

示例代码


class StatsObserver : IRtcMediaStatsObserver
{

};

StatsObserver *observer = nullptr;

rtc_engine_->setStatsObserver(observer);

API参考

API 功能描述
setStatsObserver 设置当前通话统计回调
事件 功能描述
onRtcStats 当前通话全局统计回调
onLocalAudioStats 本地音频流统计信息回调
onRemoteAudioStats 通话中远端音频流的统计信息回调
onLocalVideoStats 本地视频流统计信息回调
onRemoteVideoStats 通话中远端音频流的统计信息回调
onNetworkQuality 通话中每个用户的网络上下行质量同步回调

Web

上下行网络质量同步

云信 Web SDK 通过 client.on 中的 network-quality 回调向 App 同步房间里所有成员的上下行网络质量。该回调每当发生变化的时候触发,返回的参数(数组格式),其中的元素包括:

示例代码:

client.on('network-quality', stats => {
  console.log('=====房间里所有成员的网络状况:', stats)
  let status = null
  stats.forEach(item => {
    status = 'uid: ' + item.uid + ',上行: ' + item.uplinkNetworkQuality + ',下行: ' + item.downlinkNetworkQuality
    console.log(status)
  })
})

参数说明:

质量打分数值 说明
0 网络质量未知
1 网络质量极好
2 用户主观感觉和极好差不多,但码率可能略低于极好
3 能沟通但不顺畅
4 网络质量差
5 完全无法沟通

SDK与服务器的连接状态

云信 Web SDK 通过 Client.on 中的 connection-state-change 回调向 App 同步sdk与服务器之间的连接状态发生改变。该回调每当发生变化的时候触发,返回的参数(对象格式),其中的元素包括:

示例代码:

client.on('connection-state-change', evt => {
  console.log(evt.prevState, evt.curState);
})

SDK与服务器的连接状态参数说明:

类型 说明
DISCONNECTED 连接断开
CONNECTING 正在连接中
CONNECTED 已连接
DISCONNECTING 正在断开连接

异常事件同步

该回调通知应用房间内的异常事件。 异常事件不是错误,但是往往会引起通话质量问题。 发生异常事件后,如果恢复正常,也会收到该回调通知。

示例代码:

client.on("exception", function(evt) {
  console.log(evt.code, evt.msg, evt.uid);
});

异常事件说明:

msg code 说明
FRAMERATE_SENT_TOO_LOW 1002 视频发送帧率过低
FRAMERATE_VIDEO_BITRATE_TOO_LOW 1003 视频发送码率过低
RECV_VIDEO_DECODE_FAILED 1005 接收视频解码失败
AUDIO_INPUT_LEVEL_TOO_LOW 2001 发送音量过低
AUDIO_OUTPUT_LEVEL_TOO_LOW 2002 接收音量过低
SEND_AUDIO_BITRATE_TOO_LOW 2003 音频发送码率过低
RECV_AUDIO_DECODE_FAILED 2005 接收音频解码失败

系统信息同步

该功能处于测试阶段,浏览器兼容信息请参考 Battery Status API

调用 client.getSystemStats 方法获取系统信息。目前只能获取系统电量信息。

示例代码:

client.getSystemStats((stats) => {
    console.log(`Current battery level: ${stats.BatteryLevel}`);
});

网络相关数据

调用 client.getTransportStats 方法获取网络类型和网络连接状况统计数据。具体参数如下:

示例代码:

setInterval(() => {
  client.getTransportStats((stats) => {
    console.log(`Current Transport txRtt: ${stats.txRtt}`);
    console.log(`Current Network Type: ${stats.networkType}`);
    console.log(`Current Transport OutgoingAvailableBandwidth: ${stats.OutgoingAvailableBandwidth}`);
  });
}, 1000)    

获取当前会话的统计数据

本方法仅支持 Chrome 浏览器。

调用 client.getSessionStats 方法获取与当前会话相关的统计数据,包括:

示例代码:

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 浏览器。

调用以下方法获取本地发布流的音频和视频统计数据。

本地流音频统计信息

client.getLocalAudioStats 方法提供本地发布流的音频统计数据,包括:

示例代码:

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)

本地流视频统计信息

本方法仅支持 Chrome 浏览器。

client.getLocalVideoStats 方法提供本地发布流的视频统计数据,一个 uid 对应一组数据,包括:

示例代码:

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 浏览器。

Client.getRemoteAudioStats 方法提供远端订阅流的音频统计数据,一个 uid 对应一组数据,包括:

示例代码:

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)

远端流视频统计信息

本方法仅支持 Chrome 浏览器。

client.getRemoteVideoStats 方法提供远端订阅流的视频统计数据,一个 uid 对应一组数据,包括:

示例代码:

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)

API参考

方法 功能描述
getLocalAudioStats 获取本地发布流的音频统计数据
getLocalVideoStats 获取本地发布流的视频统计数据
getRemoteAudioStats 获取远端订阅流的音频统计数据
getRemoteVideoStats 获取远端订阅流的视频统计数据
getSessionStats 获取会话的连接状况统计数据
×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。