在使用 ZEGO Express SDK 进行通话中,用户有时会出现网络不好的情况,此时您可以通过相关回调了解当前通话的网络质量和音频/视频信息的变化。
例如,在进行多人音视频通话或者多人唱歌时,我们需要实时显示用户的网络质量,就可以参考本文档实现相应功能。
请参考 下载示例源码 获取源码。
相关源码请查看 “lib\topics\StreamAdvanced\stream_monitoring” 目录下的文件。
在监测通话质量之前,请确保:
您可以通过监听 onNetworkQuality 回调,收到房间内用户(包括您自己)的上下行网络质量。此回调每隔两秒会收到一次,网络质量等级请参考 ZegoStreamQualityLevel。
不同版本的 onNetworkQuality 回调逻辑有所不同:
版本号 | 回调逻辑 |
---|---|
2.22.0 及以上 |
基于 2.14.0 ~ 2.21.1 的 onNetworkQuality 接口的回调逻辑上,还可预估远端推流用户的网络情况,如果远端推流用户心跳丢失 1 次,回调其网络质量为 unknown;如果远端推流用户心跳丢失达到 3 次,回调其网络质量为 die。 |
2.14.0 ~ 2.21.1 |
|
2.10.0 ~ 2.13.1 |
|
ZegoExpressEngine.onNetworkQuality = (String userID, ZegoStreamQualityLevel upstreamQuality, ZegoStreamQualityLevel downstreamQuality) {
if (userID.isEmpty) {
// 代表本地用户(本端)的网络质量
// ("我的上行网络质量是 $upstreamQuality");
// ("我的下行网络质量是 $downstreamQuality");
} else {
//代表房间内其他用户的网络质量
//("用户 $userID 的上行网络质量是 $upstreamQuality");
//("用户 $userID 的下行网络质量是 $downstreamQuality");
}
/*
ZegoStreamQualityLevel.Excellent, 网络质量极好
ZegoStreamQualityLevel.Good, 网络质量好
ZegoStreamQualityLevel.Medium, 网络质量正常
ZegoStreamQualityLevel.Bad, 网络质量差
ZegoStreamQualityLevel.Die, 网络异常
ZegoStreamQualityLevel.Unknown, 网络质量未知
*/
};
如果上述的基础网络质量报告不能满足您的需求,ZEGO 还提供了更详细的推流质量报告、拉流质量报告以及其他相关信息供您参考。
推流质量报告是指描述用户把音视频推送到 ZEGO 服务端这个过程的质量报告,包含了采集、编码阶段音视频流的帧率,传输(发送)的音视频流的帧率、码率、延时及丢包率。
您可以通过注册 onPublisherQualityUpdate 接收推流质量回调,推流成功后,每隔三秒会收到此回调。您可根据 quality(ZegoPublishStreamQuality) 参数实时了解推送的音视频流的健康情况。
// 开发者可以在此回调中监控具体的质量以上报到业务服务器做监控,或者监控质量对象的某个字段以给用户友好的提示
ZegoExpressEngine.onPublisherQualityUpdate = (String streamID, ZegoPublishStreamQuality quality) {
String networkQuality = "";
// level 代表了推流质量的综合分数,大部分情况下,开发者可以参考此分数展示上行网络的质量
switch (quality.level) {
case ZegoStreamQualityLevel.Excellent:
networkQuality = "非常好";
break;
case ZegoStreamQualityLevel.Good:
networkQuality = "好";
break;
case ZegoStreamQualityLevel.Medium:
networkQuality = "一般";
break;
case ZegoStreamQualityLevel.Bad:
networkQuality = "差";
break;
case ZegoStreamQualityLevel.Die:
networkQuality = "失败";
break;
case ZegoStreamQualityLevel.Unknown:
networkQuality = "未知";
break;
default:
break;
}
//("网络质量是:$networkQuality");
};
拉流质量报告指用户拉取播放音视频流这个过程的质量报告,包含了接收的音视频流的帧率、码率、延时和丢包率,解码阶段音视频流的帧率,以及渲染阶段的帧率、卡顿率、音视频整体质量。
您可以通过注册 onPlayerQualityUpdate 接收拉流质量回调,拉流成功后,每隔三秒会收到此回调。您可根据 quality(ZegoPlayStreamQuality) 参数实时了解拉取的音视频流的健康情况。
// 开发者可以在此回调中监控具体的质量以上报到业务服务器做监控,或者监控质量对象的某个字段以给用户友好的提示
ZegoExpressEngine.onPlayerQualityUpdate = (String streamID, ZegoPlayStreamQuality quality) {
String networkQuality = "";
// level 代表了拉流质量的综合分数,大部分情况下,开发者可以参考此分数展示下行网络的质量
switch (quality.level) {
case ZegoStreamQualityLevel.Excellent:
networkQuality = "非常好";
break;
case ZegoStreamQualityLevel.Good:
networkQuality = "好";
break;
case ZegoStreamQualityLevel.Medium:
networkQuality = "一般";
break;
case ZegoStreamQualityLevel.Bad:
networkQuality = "差";
break;
case ZegoStreamQualityLevel.Die:
networkQuality = "失败";
break;
case ZegoStreamQualityLevel.Unknown:
networkQuality = "未知";
break;
default:
break;
}
//("网络质量是:%s", networkQuality);
};
ZEGO Express SDK 2.16.0 版本开始,拉流质量回调 onPlayerQualityUpdate 中新增 "mos" 字段,表示对拉流音质的评分。开发者对音频质量比较关注时,可通过该字段了解当前音频的质量情况。
“mos” 字段的取值范围为 [-1, 5],其中 -1 表示未知(例如异常拉流时无法评分),[0, 5] 表示正常评分区间。实时音频 MOS 评分对应的主观音质感受如下:
MOS 值 | 评价标准 |
---|---|
4.0 ~ 5.0 |
音质很好,清晰流畅,听的清楚。 |
3.5 ~ 4.0 |
音质较好,偶有音质损伤,但依然清晰流畅,听的清楚。 |
3.0 ~ 3.5 |
音质一般,偶有卡顿,需要一点注意力才能听清。 |
2.5 ~ 3.0 |
音质较差,卡顿频繁,需要集中注意力才能听清。 |
2.0 ~ 2.5 |
音质很差,部分语义丢失,难以交流。 |
0 ~ 2.0 |
音质极差,大量语义丢失,无法交流。 |
-1 |
未知。 |
在推流成功后,您可以通过 onPublisherStateUpdate 获取推流状态变更的通知。
ZegoExpressEngine.onPublisherStateUpdate = (String streamID, ZegoPublisherState state, int errorCode, Map<String, dynamic> extendedData) {
// 当 state 为 ZegoPublisherState.NoPublish,且 errcode 非 0 时,表示推流失败,同时不会再进行重试推流,此时可在界面作出推流失败提示
// 当 state 为 ZegoPublisherState.PublishRequesting ,且 errcode 非 0 时,表示在重试推流,此时如果超出重试时间未成功推流会抛出推流失败通知
};
您可以根据回调内的 “state” 参数是否在 “正在请求推流状态” 来大体判断用户的推流网络情况。“state” 参数的取值与用户推流状态对应如下:
枚举值 | 说明 |
---|---|
ZegoPublisherState.NoPublish |
未推流状态,在推流前处于该状态。如果推流过程出现稳态的异常,例如 AppID、AppSign、或 Token 等不正确,或者其他用户已经在推送流,且推送相同流 ID 的流,此时会失败,都会进入未推流状态。 |
ZegoPublisherState.PublishRequesting |
正在请求推流状态,推流操作执行成功后会进入正在请求推流状态,通常通过该状态进行 UI 界面的展示。如果因为网络质量不佳产生的中断,SDK 会进行内部重试,也会回到正在请求推流状态。 |
ZegoPublisherState.Publishing |
正在推流状态,进入该状态表明推流已经成功,用户可以正常通信。 |
参数 “extendedData” 为状态更新附带的扩展信息。若使用 ZEGO 的 CDN 内容分发网络,在推流成功后,该参数的内容的键为 “flv_url_list”、“rtmp_url_list”、“hls_url_list”,分别对应 FLV、RTMP、HLS 协议的拉流 URL。
在拉流成功后,开发者可通过 onPlayerStateUpdate 获取拉流状态变更的通知。
ZegoExpressEngine.onPlayerStateUpdate = (String streamID, ZegoPlayerState state, int errorCode, Map<String, dynamic>extendedData) {
// 当 state 为 ZegoPlayerState.NoPlay,且 errcode 非 0 时,表示拉流失败,同时不会再进行重试拉流了,此时可在界面作出拉流失败提示
// 当 state 为 ZegoPlayerState.PlayRequesting,且 errcode 非 0 时,表示重试拉流,此时如果超出重试时间未成功拉到流会抛出拉流失败通知
};
开发者可根据 “state” 参数是否在 “正在请求拉流状态” 来大体判断用户的拉流网络情况。“state” 参数的取值与用户拉流状态对应如下:
枚举值 | 说明 |
---|---|
ZegoPlayerState.NoPlay |
未拉流状态,在拉流前处于该状态。如果拉流过程出现稳态的异常,例如 AppID、AppSign、或 Token 等不正确,都会进入未拉流状态。 |
ZegoPlayerState.PlayRequesting |
正在请求拉流状态,拉流操作执行成功后会进入正在请求拉流状态,通常通过该状态进行应用界面的展示。如果因为网络质量不佳产生的中断,SDK 会进行内部重试,也会回到正在请求拉流状态。 |
ZegoPlayerState.Playing |
正在拉流状态,进入该状态表明拉流已经成功,用户可以正常通信。 |
您可以通过注册 onPublisherCapturedAudioFirstFrame 接收音频首帧回调。调用推流接口成功后,SDK 采集到第一帧音频数据时会收到此回调。
onPublisherCapturedAudioFirstFrame
接口。ZegoExpressEngine.onPublisherCapturedAudioFirstFrame = () {
};
您可以通过注册 onPublisherCapturedVideoFirstFrame 接收视频首帧回调。调用推流接口成功后,SDK 采集到第一帧视频数据时会收到此回调。
onPublisherCapturedAudioFirstFrame
接口。ZegoExpressEngine.onPublisherCapturedVideoFirstFrame = (ZegoPublishChannel channel) {
};
开发者可通过注册 onPlayerRecvAudioFirstFrame 监听拉流端音频接收首帧回调。调用拉流接口成功后,SDK 拉流拉到第一帧音频数据时会收到此回调。
onPlayerRecvAudioFirstFrame
接口。ZegoExpressEngine.onPlayerRecvAudioFirstFrame = (String streamID) {
print("onPlayerRecvAudioFirstFrame streamID:$streamID");
};
您可以通过注册 onPlayerRecvVideoFirstFrame 监听拉流端接收视频首帧回调。调用拉流接口成功后,SDK 拉流拉到第一帧视频数据时会收到此回调。
onPlayerRecvVideoFirstFrame
接口。ZegoExpressEngine.onPlayerRecvVideoFirstFrame = (String streamID) {
};
您可以通过注册 onPlayerRenderVideoFirstFrame 监听拉流端渲染完视频首帧回调。调用拉流接口成功后,SDK 拉流并渲染完第一帧视频数据后会收到此回调。
onPlayerRenderVideoFirstFrame
接口。ZegoExpressEngine.onPlayerRenderVideoFirstFrame = (String streamID) {
};
您可以通过注册 onPublisherVideoSizeChanged 监听采集视频大小变更回调。推流成功后,在推流中途如果视频采集分辨率发生变化将会收到此回调。
ZegoExpressEngine.onPublisherVideoSizeChanged = (int width, int height, ZegoPublishChannel channel) {
};
您可以通过注册 onPlayerVideoSizeChanged 获取拉流分辨率变更通知。拉流成功后,在拉流中途如果有视频分辨率发生变化将会收到此回调,用户可根据流的最终分辨率调整显示。
ZegoExpressEngine.onPlayerVideoSizeChanged = (String streamID, int width, int height) {
};
联系我们
文档反馈