本文介绍如何在通话中监测网络、音频、视频的质量。
功能介绍
在通话过程中,RTC SDK会触发与通话和直播质量相关的回调。从这些回调中,可以了解用户的互动体验,进行问题排查和用户体验的优化。此外,当用户网络状态发生变化时,SDK也会触发相关回调,上报最新的状态。
示例代码
Android端通话中质量监测:Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/StreamMonitoring/StreamMonitoringActivity.java
。
iOS端通话中质量监测:iOS/ARTCExample/BasicUsage/StreamMonitoring/StreamMonitoringVC.swift
。
前提条件
在设置视频配置之前,请确保达成以下条件:
功能实现
上下行网络质量报告
当网络质量发生变化时,用户可以通过onNetworkQualityChanged
回调获取上下行网络质量信息。
uid:用户 ID,如果为空表示本地用户上下行网络状态。
upQuality:上行网络状态。
downQuality:下行网络状态。
网络质量类型AliRtcNetworkQuality
如下:
枚举值 | 描述 |
AliRtcNetworkExcellent(0) | 网络极好。 |
AliRtcNetworkGood(1) | 网络好。 |
AliRtcNetworkPoor(2) | 网络不好。 |
AliRtcNetworkBad(3) | 网络差。 |
AliRtcNetworkVeryBad(4) | 网络极差。 |
AliRtcNetworkDisconnected(5) | 网络断开。 |
AliRtcNetworkUnknow(6) | 网络质量未知。 |
统计信息报告
onAliRtcStats
回调每2秒触发一次,用于实时反馈通话过程中的各种统计数据,包括数据传输统计数据、CPU使用、通话时长、丢包率等。详细指标介绍请参考AliRtcStats。
音频质量报告
音频推流数据统计
onRtcLocalAudioStats
回调主要用于实时反馈本地音频发送端的统计信息。该回调每 2s 触发一次,开发者可通过此接口监控音频质量、网络状况和推流状态等数据。返回的部分指标信息如下:
sentSamplerate:采样率(单位:Hz),例如44100、48000。表示当前音频帧的采样频率,影响音质清晰度。
numChannel:声道数,如1(单声道)、2(立体声)。决定音频空间感和传输开销。
sentBitrate:发送码率(单位:kbps),表示当前音频编码后每秒发送的数据量。码率越高音质越好,但带宽占用越大。
更多统计指标及其介绍请参考AliRtcLocalAudioStats
。
音频订阅数据统计
onRtcRemoteAudioStats
回调主要用于实时反馈远端用户的音频流的统计信息。该回调每隔 2s 触发一次,提供关于音频质量、网络状况和播放性能的详细数据。下面为部分指标信息:
quality:
0:Unknow,质量未知。
1:Excellent,质量极好。
2:Good,质量好,码率略低。
3:Poor,用户主观感受有瑕疵,但不影响沟通。
4:Bad,质量差,沟通不顺畅。
5:Very Bad,质量极差,基本不能沟通。
6:NetworkDisconnected,网络断开,完全无法沟通。
audioTotalFrozenRate:自加入频道音频播放卡顿率。
network_transport_delay:发送端到接收端的网络延时(ms)。
更多指标及详细介绍请参考AliRtcRemoteAudioStats
。
视频质量报告
视频推流数据统计
onRtcLocalVideoStats
回调主要用于实时反馈本地视频发送端的统计信息。该回调每 2s 触发一次,开发者可通过此接口监控视频编码质量、网络状况、推流状态等数据。返回的部分指标信息如下:
actualEncodeBitrate:实际编码码率,表示实际编码过程中使用的码率。
sentBitrate:发送码率(单位:kbps),表示实际通过网络发送的视频码率。
captureFps、encodeFps、sentFps:视频采集、编码、发送帧率。
avgQp:每秒平均QP(Quantization Parameter),反映视频编码质量。通常 QP 值越小,压缩率越低。
更多统计指标及其介绍请参考AliRtcLocalVideoStats
。
视频订阅数据统计
onRtcRemoteVideoStats
回调主要用于实时反馈远端用户的视频流的统计信息。该回调每隔 2s 触发一次,提供关于视频质量、网络状况和播放性能的详细数据。下面为部分指标信息:
width、height:视频分辨率。
decodeFps、renderFps:视频解码、渲染的帧率。
videoTotalFrozenRate:视频播放的累计卡顿率。
更多指标及详细介绍请参考AliRtcRemoteVideoStats
。
示例代码
Android
// 上下行网络质量
private AliRtcEngineEventListener mRtcEngineEventListener = new AliRtcEngineEventListener() {
// 网络质量变化
@Override
public void onNetworkQualityChanged(String uid, AliRtcEngine.AliRtcNetworkQuality upQuality, AliRtcEngine.AliRtcNetworkQuality downQuality){
super.onNetworkQualityChanged(uid, upQuality, downQuality);
// TODO: 添加业务逻辑
}
}
// 统计数据回调
private AliRtcEngineNotify mRtcEngineNotify = new AliRtcEngineNotify() {
@Override
public void onAliRtcStats(AliRtcEngine.AliRtcStats stats){
super.onAliRtcStats(stats);
mRtcStats = stats;
updateStatsDisplay();
}
@Override
public void onRtcLocalAudioStats(AliRtcEngine.AliRtcLocalAudioStats aliRtcStats){
super.onRtcLocalAudioStats(aliRtcStats);
mLocalAudioStats = aliRtcStats;
}
@Override
public void onRtcRemoteAudioStats(AliRtcEngine.AliRtcRemoteAudioStats aliRtcStats){
super.onRtcRemoteAudioStats(aliRtcStats);
mRemoteAudioStats = aliRtcStats;
}
@Override
public void onRtcLocalVideoStats(AliRtcEngine.AliRtcLocalVideoStats aliRtcLocalVideoStats){
super.onRtcLocalVideoStats(aliRtcLocalVideoStats);
mLocalVideoStats = aliRtcLocalVideoStats;
}
@Override
public void onRtcRemoteVideoStats(AliRtcEngine.AliRtcRemoteVideoStats aliRtcRemoteVideoStats){
super.onRtcRemoteVideoStats(aliRtcRemoteVideoStats);
mRemoteVideoStats = aliRtcRemoteVideoStats;
// 更新显示所有统计信息
updateStatsDisplay();
}
}
iOS
extension StreamMonitoringMainVC: AliRtcEngineDelegate {
// MARK: Network Quality
func onNetworkQualityChanged(_ uid: String, up upQuality: AliRtcNetworkQuality, downNetworkQuality downQuality: AliRtcNetworkQuality) {
}
// MARK: Stream Monitoring Callback
func onRtcStats(_ stats: AliRtcStats) {
}
func onRtcLocalAudioStats(_ localAudioStats: AliRtcLocalAudioStats) {
}
func onRtcRemoteAudioStats(_ remoteAudioStats: AliRtcRemoteAudioStats) {
}
func onRtcLocalVideoStats(_ localVideoStats: AliRtcLocalVideoStats) {
}
func onRtcRemoteVideoStats(_ remoteVideoStats: AliRtcRemoteVideoStats) {
}
}