实时对讲功能是语音会议的一种特殊形式,默认最大支持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日