多人音视频通话

本章节介绍多人实时音视频通话的相关功能。多人实时音视频通话顾名思义是支持多个人同时进行实时音视频通话,可以选择纯音频模式,或音视频模式。在这里需要明确几个概念:

房间:房间就是用户进行多人实时音视频通话的地方,房间以房间名称为唯一标识,多人房间需要先创建成功后才能加入,当所有用户都离开房间后,可以复用该房间名重新创建。

互动者:互动者是指在多人通话时可以参与互动,可以发言的人,这些用户可以发送上行的音频或视频数据,也可以接收其他互动者下行的音频或视频数据。

观众:观众是指在多人通话时只可以观看的人,没有发言的权限,这些用户只可以接收互动者下行的音频或视频数据,不可以发送上行音频或视频数据。

其中互动者和观众身份可以随时切换。

多人音视频通话流程

多人音视频通话的流程图

sequenceDiagram participant A participant Conference participant B participant ... A->>Conference :预订多人会议(reserveMeeting) A->>Conference :加入多人会议(joinMeeting) B->>Conference :加入多人会议(joinMeeting) Conference->>A :观众加入多人会议通知(onUserJoined) B->>Conference :离开多人会议(leaveMeeting) Conference->>A :观众离开多人会议通知(onUserLeft) A->>Conference :离开多人会议(leaveMeeting)

创建房间

在进行多人视频通话之前需要,创建者需要先进行创建房间。

@protocol NIMNetCallManager <NSObject>
/**
 *  预订多人会议
 *
 *  @param meeting    预订的多人会议
 *  @param completion 预订会议结果
 */
- (void)reserveMeeting:(NIMNetCallMeeting *)meeting
            completion:(nullable NIMNetCallMeetingHandler)completion;
@end

API参数说明

参数 类型 说明
meeting NIMNetCallMeeting 预订的多人会议
completion nullable NIMNetCallMeetingHandler 预订会议结果
//初始化会议
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
//指定会议名
meeting.name = @"meetingName";
meeting.actor = YES;

//预订会议  
[[NIMAVChatSDK sharedSDK].netCallManager reserveMeeting:meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
    //预订会议失败
    if (error) {
    }

    //预订会议成功
    else { 
    }
 }];

加入房间

在创建完房间后,需要加入房间,正式开始多人通话

@protocol NIMNetCallManager <NSObject>
/**
 *  加入多人会议
 *
 *  @param meeting    需要加入的多人会议
 *  @param completion 加入会议结果
 *
 *  @discussion 如果需要 SDK 自动开启摄像头,需要在 meeting 中指定 option 的视频采集参数 videoCaptureParam
 */
- (void)joinMeeting:(NIMNetCallMeeting *)meeting
         completion:(nullable NIMNetCallMeetingHandler)completion;
@end

API参数说明

参数 类型 说明
meeting NIMNetCallMeeting 需要加入的多人会议
completion NIMNetCallMeetingHandler 加入会议结果
//初始化会议
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
//指定会议名
meeting.name = @"meetingName";
meeting.actor = YES;

//初始化option参数
NIMNetCallOption *option = [[NIMNetCallOption alloc]init];
meeting.option = option;

//指定 option 中的 videoCaptureParam 参数
NIMNetCallVideoCaptureParam *param = [[NIMNetCallVideoCaptureParam alloc] init];
//清晰度480P
param.preferredVideoQuality = NIMNetCallVideoQuality480pLevel;
//裁剪类型 16:9
param.videoCrop  = NIMNetCallVideoCrop16x9;
//打开初始为前置摄像头
param.startWithBackCamera = NO;

option.videoCaptureParam = param;

//加入会议
[[NIMAVChatSDK sharedSDK].netCallManager joinMeeting:_meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
     //加入会议失败
     if (error) {
     }
     //加入会议成功
     else
     {
     }
}];

离开房间

离开房间

@protocol NIMNetCallManager <NSObject>
/**
 *  离开多人会议
 *
 *  @param meeting 需要离开的多人会议
 * 
 *  @discussion 当所有加入的人都离开了某会议, 该会议对应的名称才可以被重复预订
 *
 */
- (void)leaveMeeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
meeting NIMNetCallMeeting 需要离开的多人会议
//获取当前会议
NIMNetCallMeeting *meeting = [self getCurrentMeeting];

//离开当前多人会议
[[NIMAVChatSDK sharedSDK].netCallManager leaveMeeting:meeting];

用户加入房间通知

其他用户加入房间时,会收到通知

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  用户加入了多人会议
 *
 *  @param uid     用户 id
 *  @param meeting 用户加入的会议
 */
- (void)onUserJoined:(NSString *)uid
             meeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
uid NSString 用户 id
meeting NIMNetCallMeeting 用户加入的会议
//收到用户加入通知
- (void)onUserJoined:(NSString *)uid meeting:(NIMNetCallMeeting *)meeting
{
    //更新会议在线人数
}

用户离开房间通知

当其他用户离开房间时,用户将会收到离开通知

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  用户离开了多人会议
 *
 *  @param uid    用户 id
 *  @param meeting 用户离开的会议
 */
- (void)onUserLeft:(NSString *)uid
           meeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
uid NSString 用户 id
meeting NIMNetCallMeeting 用户离开的会议
//用户离开通知
- (void)onUserLeft:(NSString *)uid meeting:(NIMNetCallMeeting *)meeting
{
    //更新会议在线人数
}

房间发生了错误

一些异常情况可能会引起会议出错,请在收到该回调以后主动离开房间。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  会议发生了错误
 *
 *  @param error   错误信息
 *  @param meeting 发生错误的会议
 */
- (void)onMeetingError:(NSError *)error
               meeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
error NSError 错误信息
meeting NIMNetCallMeeting 发生错误的会议
//会议发生错误
- (void)onMeetingError:(NSError *)error meeting:(NIMNetCallMeeting *)meeting
{
    [self.presentingViewController.view makeToast:@"连接断开,请检查网络设置"
                                        duration:2
                                        position:CSToastPositionCenter];

    [self dismiss];
}