实时对讲功能是语音会议的一种特殊形式,默认最大支持5方,专有云根据选定套餐进行扩展。发言人必须抢麦才能发言,只能有人放麦以后,其他人才能抢麦。
注意:5.0以上的SDK集成的客户端,测试音视频功能,音视频,会议,群组等操作需要,先将在我们控制台创建的应用上线,才可测试(控制台提供的测试demo中的应用id和应用token,不能用来测试,需要使用自己在官网控制台创建的应用的id和应用token)
1.1、接口逻辑:
接口调用是采取“请求回调”和“通知回调”的方式和服务端交互。用户发出创建对讲、抢麦等操作时,在对应的sdk的方法参数中有“请求回调”方法,请求的结果直接在参数的回调方法中处理。会议中的成员收到服务端发送过来的消息通过“通知回调”方法-(void)onReceiveInterphoneMeetingMsg:(ECInterphoneMeetingMsg *)msg;来接收并进行处理。
1.2、业务流程
(1)用户A创建实时对讲,创建的同时选择用户B、用户C加入
(2)用户A先被加入到实时对讲会议室中
(3)用户B和用户C收到请求并同意加入,同时用户A收到用户B和用户C加入的通知消息
(4)通过退出接口可以退出实时对讲
(5)实时对讲只要有一个人,实时对讲就不会结束,直到所有人退出实时对讲,会议室自动关闭
//要邀请的成员数组 NSMutableArray * inviteArray = [[NSMutableArray alloc] initWithObjects:@" John的电话号",@" Smith的电话号", nil]; [[ECDevice sharedInstance].meetingManager createInterphoneMeetingWithMembers:inviteArray completion:^(ECError *error, NSString *meetingNumber) { // error创建实时对讲回调状态码 //meetingNo 创建实时对讲回调的会议号 if(error.errorCode==ECErrorType_NoError){ NSLog(@"创建实时对讲成功,跳转到实时对讲界面"); }else { NSLog(@"创建实时对讲失败"); } }];
-(void)onReceiveInterphoneMeetingMsg:(ECInterphoneMeetingMsg *)msg{ ECInterphoneMeetingMsgType type= msg.type; if (type== Interphone_INVITE) { NSLog(@"邀请加入实时对讲"); } else if(type== Interphone_OVER) { NSLog(@"退出实时对讲"); } }
[[ECDevice sharedInstance].meetingManager exitMeeting];
NSString* meetingNo =@”所在的实时对讲的会议号”; [[ECDevice sharedInstance].meetingManager controlMicInInterphoneMeeting: meetingNo completion:^(ECError *error,NSString *memberVoip ){ // memberVoip当前在麦上的账号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"控麦成功,请讲话"); } else { NSLog(@"控麦失败,稍后重试"); } }];
NSString* meetingNo =@”所在的实时对讲的会议号”; [[ECDevice sharedInstance].meetingManager releaseMicInInterphoneMeeting: meetingNo completion:^(ECError *error,NSString *memberVoip ){ // memberVoip当前在放麦人的账号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"放麦成功,请讲话"); } else { NSLog(@"放麦失败,稍后重试"); } }];
语音会议只是多人参加的基于互联网、或者基于电话或者网络和电话混合的会议。Sdk最多支持32方语音会议。
1.1、接口逻辑:
接口调用是采取“请求回调”和“通知回调”的方式和服务端交互。在对应的sdk的方法参数中有“请求回调”方法,请求的结果直接在参数的回调方法中处理。。会议中的成员收到服务端发送过来的消息通过“通知回调”方法-(void)onReceiveMultiVoiceMeetingMsg:(ECMultiVoiceMeetingMsg *)msg来接收并进行处理。
1.2、业务流程
(1)用户A创建语音会议或者电话会议
(2)会议创建成功之后,邀请其他成员加入会议
(3)其他成员收到邀请,同意或拒绝加入会议
功能:创建语音、视频会议。 参数:params 创建语音、视频会议的参数对象 参考ECCreateMeetingParams对象。 ecMultMeetingType 创建会议的类型、语音、视频会议二种。 返回值:无 ECCreateMeetingParams *params =[[ECCreateMeetingParams alloc]init]; params.meetingType =会议类型 params.MeetingName= @"会议名称"; params.MeetingPwd=@"会议密码"; params.Square=@"创建几路视频"; params.AutoClose=@"创建者退出后会议是否解散"; params.AutoJoin= @"创建后,创建者是否自动加入会议"; params.AutoDelete= @"是否为永久会议"; params.VoiceMod= @"背景音乐"; params.Keywords=@"业务属性"; [[ECDevice sharedInstance].meetingManager createMultMeetingByType:params andType:More_Voice completion:^(NSUInteger error,NSString *meetingNo ){ //meetingNo 创建会议回调的会议号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"会议创建成功,请讲话"); } else { NSLog(@"会议创建失败,稍后重试"); } }];
功能:邀请用户加入语音会议 参数: meetingNumber 会议号 isLoadingCall用户登录的是电话号或者通讯号码 members被邀请加入语音会议的成员号 返回值:无 NSString* meetingNumber=@”会议号”; NSMutableArray *selectArray = [[NSMutableArray alloc] initWithObjects:@" John的电话号",@" Smith的电话号", nil]; [[ECDevice sharedInstance].meetingManager inviteMembersJoinToVoiceMeeting: meetingNumber andIsLoandingCall:(alertView.tag==ChatRoomVIEW_addmember) andMembers: selectArray completion:^(ECError *error, NSString *meetingNumber) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"邀请成员成功"); } else { NSLog(@"邀请成员失败"); } }];
功能:通过会议类型加入会议。 参数:meetingNumber 会议号 meetingType 会议的类型; meetingPwd 会议的密码。 返回值:无。 NSString* roomNo =@”会议号”; NSString* pwd =@”会议密码”; [[ECDevice sharedInstance].meetingManager joinMeeting:roomNo ByMeetingType:ECMeetingType_MultiVoice andMeetingPwd:pwd completion:^(ECError *error, NSString *meetingNumber) { //meetingNo加入会议回调的会议号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"加入会议成功"); } else { NSLog(@"加入会议失败"); } }];
功能:通过会议类型加入会议。 参数:meetingNumber会议号 multMeetingType会议的类型; 返回值:无。 NSString* meetingNo =@”要解散的会议id”; [[ECDevice sharedInstance].meetingManager deleteMultMeetingByMeetingType:ECMeetingType_MultiVoice andMeetingNumber: meetingNo completion:^(ECError *error, NSString *meetingNumber) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"解散会议成功"); } else { NSLog(@"解散会议失败"); } }];
功能:退出会议 参数:无。 [[ECDevice sharedInstance].meetingManager exitMeeting];
功能:从语音、视频会议移除成员 参数: meetingNumber会议号 multMeetingType会议的类型; 会议的类型 、语音或者视频。 membervVoip被移除成员的手机号码 返回值:无. NSString* curRoomNo =@”当前的会议id”; NSString* meetingnumber =@”要踢出的成员”; [[ECDevice sharedInstance].meetingManager removeMemberFromMultMeetingByMeetingType:ECMeetingType_MultiVoice andMeetingNumber: curRoomNo andMember: meetingnumber completion:^(ECError *error, ECVoIPAccount *membervVoip) { //member被移除会议成员的号码 if (error.errorCode == ECErrorType_NoError) { NSLog(@"踢出会议成员"); } else { NSLog(@"踢出会议成员失败"); } }];
- (void)onReceiveMultiVoiceMeetingMsg:(ECMultiVoiceMeetingMsg *)msg { ECMultiVoiceMeetingMsgType *msgType= msg.type; if(msgType== MultiVoice_JOIN) { NSLog(@"有人加入"); } else if(msgType== MultiVoice_EXIT) { NSLog(@"有人退出"); } else if(msgType== MultiVoice_DELETE) { NSLog(@"房间被删除退出"); } else if(msgType== MultiVoice_REMOVEMEMBER) { NSLog(@"有人被移除"); } else if(msgType== MultiVoice_REFUSE) { NSLog(@"会议释放掉"); } }
功能:获取应用下面的语音或视频会议列表。 参数: Keywords业务属性 multMeetingType会议的类型 返回值:无 NSString* keywords =@”业务属性”; [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType:(ECMeetingType)multMeetingType andKeywords:(NSString *)keywords completion:(void(^)(ECError *error, NSArray * meetingList))completion { if (error.errorCode == ECErrorType_NoError) { NSLog(@"获取列表成功"); } else { NSLog(@"获取列表失败"); } }];
功能:根据会议类型查询当前会议的成员 参数: meetingNumber,会议号 meetingtype会议的类型, l 回调监听 根据传入的会议类型回调不同的方法。 返回值:无 NSString *meetingNumber =@”当前的会议id”; [[ECDevice sharedInstance].meetingManager queryMeetingMembersByMeetingType:(ECMeetingType)meetingtype andMeetingNumber:(NSString *)meetingNumber completion:(void(^)(ECError *error, NSArray* members))completion { //members参与会议的成员数组 if (error.errorCode == ECErrorType_NoError) { NSLog(@"查询会议成员成功"); } else { NSLog(@"查询失败"); } }];
/** @brief 设置会议某成员是否可听可讲 @param memberVoip 成员通讯账号 @param speakListen 是否可听可讲 1、禁言 2、可讲 3、禁听 4、可听 @param meetingType 会议房间的类型 @param meetingNumber 房间号 @param completion 执行结果回调block */ ECVoIPAccount *account = “是否是通讯账号” NSInteger speakListen = “是否可听可讲 1、禁言 2、可讲 3、禁听 4、可听” ECMeetingType meetingType = “会议的类型” NSString *meetingNumber = “会议号” [[ECDevice sharedInstance].meetingManager setMember:account speakListen: speakListen ofMeetingType: meetingType andMeetingNumber: meetingNumber completion:^(ECError *error, NSString *meetingNumber) { }];
/** @brief 获取音频会议列表 @param multMeetingType 会议房间的类型 @param keywords 房间关键字 @param page 页码 @param pageSize 房间数 @param isAsc 是否升序 @param completion 执行结果回调block */ [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType: ECMeetingType_MultiVoice andKeywords:nil page:(NSInteger)page pageSize:(NSInteger)pageSize isAsc:(BOOL)isAsc completion: (ECError *error, NSArray * meetingList) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"获取列表成功"); } else { NSLog(@"获取列表失败"); } }];
视频会议只是多人参加的基于互联网、或者基于电话或者网络和电话混合的会议。
1.1、接口逻辑:
接口调用是采取“请求回调”和“通知回调”的方式和服务端交互。在对应的sdk的方法参数中有“请求回调”方法,请求的结果直接在参数的block回调中处理。会议中的成员收到服务端发送过来的消息通过“通知回调”方法onReceiveMultiVideoMeetingMsg来接收并进行处理。
1.2、业务流程
(1)用户A创建视频会议。
(2)会议创建的时候有两种方式:
根据参数设置创建者自动加入,如果创建者选择自动加入,则创建会议成功后,创建者直接加入会议。
根据参数设置创建者不自动加入会议,则会议创建成功后,创建者需要调用“加入会议接口”加入会议。
(3)其他成员获取视频会议列表,选择对应的会议加入。
(4)用户加入视频会议的同时,需要调用publishSelfVideoFrameInVideoMeeting:(NSString*)meetingNumber completion:(void(^)(ECError *error, NSString *meetingNumber))completion接口发布自己的视频。
(5)会议室成员收到有人加入会议通知,调用requestMemberVideoWithAccount:(NSString*)username andDisplayView:(UIView*)displayView andVideoMeeting:(NSString*)meetingNumber andPwd:(NSString*)meetingPwd andPort:(NSInteger)port completion:(void(^)(ECError *error, NSString *meetingNumber,NSString *member))completion请求该用户的视频数据。
(6)多路视频会议,涉及到消息体类包括:ECCreateMeetingParams、ECMeetingRoom、ECMeetingMember、ECMultiVideoMeetingMsg、ECError等,消息体类的相关属性,请参照SDK里面的说明。
功能:创建语音、视频会议。 参数:params 创建语音、视频会议的参数对象 参考ECCreateMeetingParams对象。 ecMultMeetingType 创建会议的类型、语音、视频会议二种。 返回值:无 ECCreateMeetingParams *params =[[ECCreateMeetingParams alloc]init]; params.MeetingName= @"会议名称"; params.meetingType = ECMeetingType_MultiVideo; params.Square=@"创建几路视频"; params.AutoClose=@"创建者退出后会议是否解散"; params.AutoJoin= @"创建后,创建者是否自动加入会议"; params.AutoDelete= @"是否为永久会议"; params.VoiceMod= @"背景音乐"; params.Keywords=@"业务属性"; [[ECDevice sharedInstance].meetingManager createMultMeetingByType:params completion: (ECError* error, NSString *meetingNumber) { //meetingNo 创建会议回调的会议号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"会议创建成功,请讲话"); 如果选择的是创建者自动加入的话,在会议创建成功之后就应该创建好多路视频的View,创建过程如下: 1.在跳转的页面的初始化中,直接定义好view,在view调用底层sdk里面的方法,设置本地视频窗口、然后调用创建视频会议接口。 2.设置视频通话码率[[ECDevice sharedInstance].voIPManager setVideoBitRates:@” 视频码流,kb/s,范围30-300”]; 3.设置视频通话显示的view [[ECDevice sharedInstance].voIPManager setVideoView:@” 对方显示视图” andLocalView:@” 本地显示视图”]; 4.设置视频会议地址[[ECDevice sharedInstance].meetingManager setVideoConferenceAddr:@”会议地址”]; 5.详细过程请参考demo中,MultiVideoConfViewController页面。 } else { NSLog(@"会议创建失败,稍后重试"); } }];
功能:通过会议类型加入会议。 参数:meetingNo 会议号 meetingType 会议的类型; meetingPwd 会议的密码。 返回值:无。 如果选择不是自动加入的话,需要在自动加入前设置多路视频view,创建过程与自动加入的过程一致。 NSString* meetingNo =@”会议号”; NSString* meetingpwd =@”会议密码”; [[ECDevice sharedInstance].meetingManager joinMeeting: meetingNo ByMeetingType: ECMeetingType_MultiVideo andMeetingPwd: meetingpwd completion: (ECError* error, NSString *meetingNumber) { //meetingNo加入会议回调的会议号 if (error.errorCode == ECErrorType_NoError) { NSLog(@"加入会议成功"); } else { NSLog(@"加入会议失败"); } }];
功能:通过会议类型加入会议。 参数:meetingNo 会议号 meetingType 会议的类型 appId 应用id 返回值:无。 NSString* meetingNo =@”要解散的会议id”; [[ECDevice sharedInstance].meetingManager deleteMultMeetingByMeetingType: ECMeetingType_MultiVideo e andMeetingNumber: meetingNo completion: (ECError *error, NSString *meetingNumber) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"解散会议成功"); } else { NSLog(@"解散会议失败"); } }];
功能: 邀请成员加入视频会议 参数:meetingNo 会议号 type 会议的类型视频。 Member 被移除成员的通讯账号或者手机号码 返回值:无. NSString* meetingNo =@”当前的会议id”; NSString* meetingnumber =@”邀请的成员通讯账号”; BOOL isLoadingCall = YES/NO; //用户登录的是手机号或者通讯账号,YES是手机号,NO是通讯账号 [[ECDevice sharedInstance].meetingManager inviteMembersJoinMultiMediaMeeting: meetingNo andIsLoandingCall: isLoadingCall andMembers: meetingnumber completion:^(ECError *error, NSString *meetingNumber) {// meetingNumber加入会议成员的号码 if (error.errorCode == ECErrorType_NoError) { NSLog(@"邀请会议成员成功"); } else { NSLog(@"邀请会议成员失败"); } }]; 邀请成员(通讯账号或者电话号),被邀请方需要处理的事件,在-(NSString*)onMeetingCallReceived:(NSString*)callid withCallType:(CallType)calltype withMeetingData:(NSDictionary*)meetingData;的方法中需要做处理。这个方法只有音视频会议邀请成员才会调用。具体事例如下: 功能:有会议呼叫邀请 参数; callid 会话id calltype 呼叫类型 meetingData 会议的数据 -(NSString*)onMeetingCallReceived:(NSString*)callid withCallType:(CallType)calltype withMeetingData:(NSDictionary*)meetingData { if ([DemoGlobalClass sharedInstance].isCallBusy) {//当有邀请呼入或者正在通话过程中,需要告知对方,线路处于忙碌状态需要等待。 [[ECDevice sharedInstance].VoIPManager rejectCall:callid andReason:ECErrorType_CallBusy]; return @""; } UIViewController *incomingCallView = nil; if (calltype == VIDEO) {//当多路视频会议邀请时,需要处理的事件,弹出来电窗口 } else {// 当音频会议邀请时,弹出来电窗口 } [DemoGlobalClass sharedInstance].isCallBusy = YES;//有来电呼入时,需要先把状态置为忙碌状态。 return nil; }
[[ECDevice sharedInstance].meetingManager exitMeeting];
功能:从语音、视频会议移除成员 参数: meetingNo 会议号 type 会议的类型 、语音或者视频。 Member 被移除成员的通讯账号或者手机号码 返回值:无. NSString* meetingNo =@”当前的会议id”; NSString* meetingnumber =@”要踢出的成员”; ECVoIPAccount *membervVoip = [[ECVoIPAccount alloc] init]; membervVoip.account = meetingnumber; membervVoip.isVoip = YES; [[ECDevice sharedInstance].meetingManager removeMemberFromMultMeetingByMeetingType:ECMeetingType_MultiVideo andMeetingNumber: meetingNo andMember: membervVoip completion: (ECError *error, ECVoIPAccount *membervVoip) { //member被移除会议成员的号码 if (error.errorCode == ECErrorType_NoError) { NSLog(@"踢出会议成员"); } else { NSLog(@"踢出会议成员失败"); } }];
-(void)onReceiveMultiVideoMeetingMsg:(ECMultiVideoMeetingMsg *)msg { ECVideoMeetingMsgType type= msg.type; if(msgType==Video_JOIN) { NSLog(@"有人加入"); } else if(msgType== Video_EXIT) { NSLog(@"有人退出"); } else if(msgType== Video_DELETE) { NSLog(@"房间被删除退出"); } else if(msgType== Video_REMOVEMEMBER) { NSLog(@"有人被踢出会议"); } else if(type==Video_PUBLISH) { NSLog(@"发布视频"); } else if(type==Video_UNPUBLISH) { NSLog(@"取消发布视频"); } }
功能:获取应用下面的语音或视频会议列表。 参数: Keywords业务属性 meetingType会议的类型 返回值:无 [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType: ECMeetingType_MultiVideo andKeywords:nil completion: (ECError *error, NSArray * meetingList) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"获取列表成功"); } else { NSLog(@"获取列表失败"); } }];
功能:根据会议类型查询当前会议的成员 参数: meetingNo,会议号 meetingType 会议的类型, 回调监听 根据传入的会议类型回调不同的方法。 返回值:无 NSString* meetingNo =@”当前的会议id”; [[ECDevice sharedInstance].meetingManager queryMeetingMembersByMeetingType: ECMeetingType_MultiVideo andMeetingNumber: meetingNo completion: (ECError *error, NSArray* member){ //members参与会议的成员数组 if (error.errorCode == ECErrorType_NoError) { NSLog(@"查询会议成员成功"); } else { NSLog(@"查询失败"); } }];
NSString* meetingNo =@”当前的会议id”; [[ECDevice sharedInstance].meetingManager publishSelfVideoFrameInVideoMeeting:meetingNo completion:^(ECError *error, NSString *meetingNumber){ if (error.errorCode == ECErrorType_NoError) { NSLog(@"发布视频成功"); } else { NSLog(@"发布失败"); } }];
NSString* meetingNo =@”当前的会议id”; [[ECDevice sharedInstance].meetingManager cancelPublishSelfVideoFrameInVideoMeeting:meetingNo completion:^(ECError *error, NSString *meetingNumber){ if (error.errorCode == ECErrorType_NoError) { NSLog(@"取消发布成功"); } else { NSLog(@"取消发布失败"); } }];
NSString* meetingNo =@”当前的会议id”; NSString* meetingPwd =@”所在的会议密码”; NSString* memberNumber =@”John的通讯账号”; XXXXXX displayView=当成功请求时,展示该成员的窗口 [[ECDevice sharedInstance].meetingManager requestMemberVideoWithAccount: memberNumber andDisplayView: displayView andVideoConference: meetingNo andPwd: meetingPwd andPort:port.integerValue completion:^(ECError *error, NSString *meetingNumber, NSString *member) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"请求成功"); } else { NSLog(@"请求失败"); } }]; 说明: 视频时(包含点对点和会议),设置远端UIView的属性contentMode:(DisplayView: displayView) UIViewContentModeScaleToFill //view默认值,图像数据显示,填充view,但不等比例拉伸 UIViewContentModeScaleAspectFit //图像等比例拉伸,完全显示内容 UIViewContentModeScaleAspectFill //图像等比例拉伸,填充view,部分内容可能不显示
NSString* meetingNo =@”当前的会议id”; NSString* meetingPwd =@”所在的会议密码”; NSString* memberNumber =@”John的通讯账号”; XXXXXX displayView=当成功请求时,展示该成员的窗口 [[ECDevice sharedInstance].meetingManager cancelConferenceMemberVideoWithAccount: memberNumber andVideoConference: meetingNo andPwd: meetingPwd completion:^(ECError *error, NSString *meetingNumber, NSString *member) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"取消成功"); } else { NSLog(@"取消失败"); } }];
/** @brief 设置会议某成员是否可听可讲 @param memberVoip 成员通讯账号 @param speakListen 是否可听可讲 1、禁言 2、可讲 3、禁听 4、可听 @param meetingType 会议房间的类型 @param meetingNumber 房间号 @param completion 执行结果回调block */ ECVoIPAccount *account = “是否是通讯账号” NSInteger speakListen = “是否可听可讲 1、禁言 2、可讲 3、禁听 4、可听” ECMeetingType meetingType = “会议的类型” NSString *meetingNumber = “会议号” [[ECDevice sharedInstance].meetingManager setMember:account speakListen: speakListen ofMeetingType: meetingType andMeetingNumber: meetingNumber completion:^(ECError *error, NSString *meetingNumber) { }];
/** @brief 获取音频会议列表 @param multMeetingType 会议房间的类型 @param keywords 房间关键字 @param page 页码 @param pageSize 房间数 @param isAsc 是否升序 @param completion 执行结果回调block */ [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType: ECMeetingType_MultiVideo andKeywords:nil page:(NSInteger)page pageSize:(NSInteger)pageSize isAsc:(BOOL)isAsc completion: (ECError *error, NSArray * meetingList) { if (error.errorCode == ECErrorType_NoError) { NSLog(@"获取列表成功"); } else { NSLog(@"获取列表失败"); } }];
文档更新时间:2016年12月4日