网络状况

本章节介绍有关网络状况的功能。针对网络状况,网易云提供了网络探测网络状况回调这两个功能。

网络探测是一个辅助的网络情况测试工具,可以探测音视频通话网络的连通性、丢包率和延迟等信息。目前支持选择音频通话和视频通话这两种通话模式的探测,视频通话的网络探测支持选择相应的清晰度进行探测。另外,网络探测会占用网络带宽资源,建议在通话开始之前使用以免影响通话质量。

网络状况回调是通话过程中,SDK定时会通知上层当前的网络状况。值得注意的是,这个网络状况是基于当前的实际通话情况的。比如,当前正进行的是音频通话,上报的网络情况是良好,那只是说明当前的网络情况可以很好地满足音频通话,并不能说明当前进行视频通话也会很流畅。

开启网络探测

开启网络探测,网络探测结果通过 completion 回调给应用

@protocol NIMAVChatNetDetectManager <NSObject>
/**
 *  开始网络探测任务
 *
 *  @param detectType 探测类型 包括音频探测 及6种清晰度的视频探测
 *
 *  @param completion 任务完成 block
 *
 *  @return 开始的网络探测任务的 id,可以用该 id 停止该任务,如果返回 0 表示开始失败
 */
- (UInt64)startDetectTaskForDetectType:(NIMAVChatNetDetectType)detectType
                            completion:(NIMAVChatNetDetectCompleteBlock)completion;
@end

API参数说明

参数 类型 说明
detectType BOOL 探测类型 包括音频探测 及6种清晰度的视频探测
completion NIMAVChatNetDetectCompleteBlock 任务完成
//开启480P视频网络探测
[[NIMAVChatSDK sharedSDK].avchatNetDetectManager startDetectTaskForDetectType:NIMAVChatNetDetectType480P
                                                              completion:^(NIMAVChatNetDetectResult * _Nonnull result) {
        //探测完成结果回调                                                      
        weakself.detectResult = result;
}];

停止网络探测

停止网络探测

@protocol NIMAVChatNetDetectManager <NSObject>
/**
 *  停止网络探测任务
 *
 *  @param taskId 需要停止的任务的 id
 */
- (void)stopDetectTask:(UInt64)taskId;
@end
参数 类型 说明
taskId UInt64 需要停止的任务的 id
//停止网络探测
[[NIMAVChatSDK sharedSDK].avchatNetDetectManager stopDetectTask:taskId];

获取网络探测日志文件路径

获取网络探测日志文件路径

@protocol NIMAVChatNetDetectManager <NSObject>
/**
 *  获得 SDK 网络探测 log 文件路径
 *
 *  @return 网络探测 log 文件路径
 */
- (NSString *)logFilepath;
@end
//获取网络探测日志文件路径
NSString *filePath = [[NIMAVChatSDK sharedSDK].avchatNetDetectManager logFilepath];

当前通话网络状况回调

当前通话网络状况回调

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  当前通话网络状态
 *
 *  @param status 网络状态
 *  @param user   网络状态对应的用户;如果是自己,表示自己的发送网络状态
 */
- (void)onNetStatus:(NIMNetCallNetStatus)status
               user:(NSString *)user;
@end
参数 类型 说明
status NIMNetCallNetStatus 状态
user NSString 网络状态对应的用户;如果是自己,表示自己的发送网络状态
//网络状况回调
- (void)onNetStatus:(NIMNetCallNetStatus)status user:(NSString *)user
{
    NSString *netState;
    switch (status) {
        case NIMNetCallNetStatusVeryGood:
            netState = @"网络通畅:";
            break;
        case NIMNetCallNetStatusGood:
            netState = @"网络正常:";
            break;
        case NIMNetCallNetStatusPoor:
            netState = @"网络一般:";
            break;
        case NIMNetCallNetStatusBad:
            netState = @"网络较差:";
            break;
        case NIMNetCallNetStatusVeryBad:
            netState = @"网络很差:";
            break;
        default:
            break;
    }
}

网络状态返回中,根据user参数来判断本人及他人,本人状态一般指本人上行网络情况,他人的网络状态指本地接收对方数据的下行网络情况。

获取当前通话网络状况

获取当前通话网络状况

@protocol NIMNetCallManager <NSObject>
/**
 *  获取当前网络通话中某用户的网络状态
 *
 *  @param user 用户. 可以传入自己的 id 以获取自己的发送网络状况
 *
 *  @return 网络状态
 */
- (NIMNetCallNetStatus)netStatus:(NSString *)user;
@end
参数 类型 说明
user NSString 用户. 可以传入自己的 id 以获取自己的发送网络状况
//获取点对点通话对方的网络状态
NIMNetCallNetStatus status = [[NIMAVChatSDK sharedSDK].netCallManager netStatus:peerUid];

网络探测结果

网络探测结果回调声明如下:

typedef void(^NIMAVChatNetDetectCompleteBlock)(NIMAVChatNetDetectResult *result)

返回的 result 包含以下参数:

/**
 网络探测任务结果
 */
@interface NIMAVChatNetDetectResult : NSObject

/**
 任务 id
 */
@property (nonatomic,assign,readonly)  UInt64 taskId;

/**
 任务执行结果,如果没有错误则为 nil
 */
@property (nonatomic,strong,readonly)  NSError *error;

/**
 丢包率百分比
 */
@property (nonatomic,assign,readonly)  NSInteger lossRate;

/**
 rtt 最大值
 */
@property (nonatomic,assign,readonly)  NSInteger rttMaximal;

/**
 rtt 最小值
 */
@property (nonatomic,assign,readonly)  NSInteger rttMinimal;

/**
 rtt 平均值
 */
@property (nonatomic,assign,readonly)  NSInteger rttAverage;

/**
 rtt 偏差
 */
@property (nonatomic,assign,readonly)  NSInteger rttMeanDeviation;

/**
 扩展信息
 */
@property (nonatomic,copy,readonly)    NSString *expandInfo;

@end

taskId 是任务标识,与开始任务接口返回的 id 对应;

error 是任务执行的结果,如果执行成功为 nil,如果执行失败,result 中的 taskId 以外的其他字段均无意义;

在上述返回的字段中,lossRate、rttAverage、rttMeanDeviation这三个值最能反应当前客户端的实际网络情况。由这三个值可以计算出当前的网络状况指数:

网络状况指数 = (lossRate/20)*50% +(rttAverage/1200)*25% +(rttMeanDeviation/150)*25%

经过我们的反复测试,现提供三个网络状况指数节点

网络状况指数节点 lossRate(%) rttAverage(ms) rttMeanDeviation(ms) 网络状况指数
A 3 500 50 0.2625
B 10 800 80 0.55
C 20 1200 150 1

备注:

1.当网络状况指数≤0.2625时,网络状况非常好,音视频通话流畅;

2.当0.2625<网络状况指数≤0.55时,网络状况好,音视频通话偶有卡顿;

3.当0.55<网络状况指数≤1时,网络状况差,音频通话流畅;

4.当网络状况指数>1时,网络状况非常差,音频通话偶有卡顿。