互联网多人视频

1、互联网多人视频说明                

 视频会议只是多人参加的基于互联网、或者基于电话或者网络和电话混合的会议。                
1.1、接口逻辑               
接口调用是采取“请求回调”和“通知回调”的方式和服务端交互。在对应的sdk的方法参数中有“请求回调”方法,请求的结果直接在参数的block回调中处理。会议中的成员收到服务端发送过来的消息通过“通知回调”方法onReceiveMultiVideoMeetingMsg来接收并进行处理。               
1.2、业务流程                
  • 用户A创建视频会议。
  • 会议创建的时候有两种方式:                
      根据参数设置创建者自动加入,如果创建者选择自动加入,则创建会议成功后,创建者直接加入会议。                                 
      根据参数设置创建者不自动加入会议,则会议创建成功后,创建者需要调用“加入会议接口”加入会议。                               
  • 其他成员获取视频会议列表,选择对应的会议加入。              
  • 用户加入视频会议的同时,需要调用publishSelfVideoFrameInVideoMeeting:(NSString*)meetingNumber  completion:(void(^)(ECError *error, NSString  *meetingNumber))completion接口发布自己的视频。          
  • 会议室成员收到有人加入会议通知,调用requestMemberVideoWithAccount:(NSString*)username  andDisplayView:(UIView*)displayView  andVideoMeeting:(NSString*)meetingNumber andPwd:(NSString*)meetingPwd  andPort:(NSInteger)port completion:(void(^)(ECError *error, NSString  *meetingNumber,NSString *member))completion请求该用户的视频数据。                
  • 多路视频会议,涉及到消息体类包括:ECCreateMeetingParams、ECMeetingRoom、ECMeetingMember、ECMultiVideoMeetingMsg、ECError等,消息体类的相关属性,请参照SDK里面的说明。
                                      

2、视频会议操作代码示例                              

创建视频会议

创建视频会议和创建音频会议是同一个接口,主要是类型不同,同时注意在创建视频会议前创建视频显示窗口,现在我们假设Tony要创建视频会议,其示例代码如下:                                        
  1. 功能:创建语音、视频会议。
  2. 参数:params 创建语音、视频会议的参数对象 参考ECCreateMeetingParams对象。
  3.       ecMultMeetingType 创建会议的类型、语音、视频会议二种。
  4. 返回值:无
  5.  
  6. ECCreateMeetingParams *params =[[ECCreateMeetingParams alloc]init];            
  7.             params.meetingName = @"会议名称";
  8.             params.meetingType = ECMeetingType_MultiVideo;
  9.             params.square = @"创建几路视频";
  10.             params.autoClose = @"创建者退出后会议是否解散";
  11.             params.autoJoin = @"创建后,创建者是否自动加入会议";
  12.             params.autoDelete = @"是否为永久会议";
  13.             params.voiceMod = @"背景音乐";
  14.             params.keywords = @"业务属性";
  15.            [[ECDevice sharedInstance].meetingManager createMultMeetingByType:params completion: (ECError* error, NSString *meetingNumber) {
  16.             //meetingNo 创建会议回调的会议号
  17.                if (error.errorCode == ECErrorType_NoError)
  18.                { 
  19.                  NSLog(@"会议创建成功,请讲话"); 
  20.                  
  21.                  如果选择的是创建者自动加入的话,在会议创建成功之后就应该创建好多路视频的View,创建过程如下:
  22.                  1.在跳转的页面的初始化中,直接定义好view,在view调用底层sdk里面的方法,设置本地视频窗口、然后调用创建视频会议接口。
  23.                  2.设置视频通话码率[[ECDevice sharedInstance].VoIPManager setVideoBitRates:@” 视频码流,kb/s,范围30-300”];
  24.                  3.设置视频通话显示的view [[ECDevice sharedInstance].VoIPManager setVideoView:@” 对方显示视图” andLocalView:@” 本地显示视图”];
  25.                  4.设置视频会议地址[[ECDevice sharedInstance].meetingManager setVideoConferenceAddr:@”会议地址”];
  26.                  5.详细过程请参考demo中,MultiVideoConfViewController页面。
  27.               }
  28.               else
  29.               {
  30.                  NSLog(@"会议创建失败,稍后重试"); 
  31.               } 
  32.           }];                                                              

主动加入视频会议

主动加入视频会议和加入音频会议是同一个接口,只是传入参数的类型不同,同时需要注意视频窗口的创建,我们假设Eric要主动加入视频会议,其示例代码如下:                                     
  1. 功能:通过会议类型加入会议。
  2. 参数:meetingNo 会议号
  3.       meetingType 会议的类型
  4.       meetingPwd 会议的密码
  5. 返回值:无
  6.  
  7. 如果选择不是自动加入的话,需要在自动加入前设置多路视频view,创建过程与自动加入的过程一致。
  8. NSString* meetingNo =@”会议号”;
  9. NSString* meetingpwd =@”会议密码”;
  10. [[ECDevice sharedInstance].meetingManager joinMeeting: meetingNo ByMeetingType: ECMeetingType_MultiVideo andMeetingPwd: meetingpwd completion: (ECError* error, NSString *meetingNumber) {
  11.        //meetingNo加入会议回调的会议号
  12.     if (error.errorCode == ECErrorType_NoError)
  13.     { 
  14.         NSLog(@"加入会议成功"); 
  15.     }
  16.     else
  17.     {
  18.         NSLog(@"加入会议失败"); 
  19.     } 
  20. }];                                                       

解散视频会议

解散视频会议我们假设Tony要解散自己创建的一个会议,其示例代码如下:                                     
  1. 功能:通过会议类型加入会议。
  2. 参数:meetingNo 会议号
  3.       meetingType 会议的类型
  4.       appId 应用id
  5. 返回值:无
  6.  
  7. NSString* meetingNo =@”要解散的会议id”;
  8. [[ECDevice sharedInstance].meetingManager deleteMultMeetingByMeetingType: ECMeetingType_MultiVideo e andMeetingNumber: meetingNo completion: (ECError *error, NSString *meetingNumber) {
  9.     if (error.errorCode == ECErrorType_NoError)
  10.     { 
  11.         NSLog(@"解散会议成功"); 
  12.     }
  13.     else
  14.     {
  15.         NSLog(@"解散会议失败"); 
  16.     }
  17. }];            

管理员主动邀请成员加入视频会议

视频会议邀请成员加入,只有会议创建者才能邀请成员,我们假设Tony要邀请John,其示例代码如下:                                        
  1. 功能: 邀请成员加入视频会议 
  2. 参数:meetingNo 会议号
  3.       type 会议的类型视频
  4.       Member 被移除成员的通讯账号或者手机号码
  5. 返回值:无
  6.  
  7. NSString* meetingNo =@”当前的会议id”;
  8. NSString* meetingnumber =@”邀请的成员通讯账号”;
  9. BOOL isLoadingCall = YES/NO; //用户登录的是手机号或者通讯账号,YES是手机号,NO是通讯账号
  10. [[ECDevice sharedInstance].meetingManager inviteMembersJoinMultiMediaMeeting: meetingNo andIsLoandingCall: isLoadingCall andMembers: meetingnumber completion:^(ECError *error, NSString *meetingNumber) 
  11. {// meetingNumber加入会议成员的号码
  12.     if (error.errorCode == ECErrorType_NoError)
  13.     { 
  14.         NSLog(@"邀请会议成员成功"); 
  15.     }
  16.     else
  17.     {
  18.         NSLog(@"邀请会议成员失败"); 
  19.     }
  20. }];
  21.  
  22. 邀请成员(通讯账号或者电话号),被邀请方需要处理的事件,在-(NSString*)onMeetingCallReceived:(NSString*)callid withCallType:(CallType)calltype withMeetingData:(NSDictionary*)meetingData;的方法中需要做处理。这个方法只有音视频会议邀请成员才会调用。具体事例如下:
  23. 功能:有会议呼叫邀请。
  24. 参数; callid 会话id
  25.       calltype 呼叫类型
  26.       meetingData 会议的数据
  27.       
  28. -(NSString*)onMeetingCallReceived:(NSString*)callid withCallType:(CallType)calltype withMeetingData:(NSDictionary*)meetingData {
  29.  
  30.     if ([DemoGlobalClass sharedInstance].isCallBusy) {//当有邀请呼入或者正在通话过程中,需要告知对方,线路处于忙碌状态需要等待。
  31.         [[ECDevice sharedInstance].VoIPManager rejectCall:callid andReason:ECErrorType_CallBusy];
  32.         return @"";
  33.     }
  34.     
  35.     UIViewController *incomingCallView = nil;
  36.     if (calltype == VIDEO) {//当多路视频会议邀请时,需要处理的事件,弹出来电窗口
  37.        
  38.     } else {// 当音频会议邀请时,弹出来电窗口
  39.        
  40.     }
  41.     [DemoGlobalClass sharedInstance].isCallBusy = YES;//有来电呼入时,需要先把状态置为忙碌状态。
  42.     return nil;
  43. }                                                                        

退出会议

和音频会议退出会议的接口是同一个,其示例代码如下:                                       
  1. [[ECDevice sharedInstance].meetingManager exitMeeting]                                              

视频会议踢出会议成员

视频会议踢出会议成员和音频会议踢出会议成员是同一个接口,只是传入会议类型不同。只有会议创建者才能踢出成员,我们假设Tony要踢出John,其示例代码如下:                
                        
  1. 功能:从语音、视频会议移除成员 参数:
  2. meetingNo 会议号
  3. type 会议的类型 、语音或者视频。Member 被移除成员的通讯账号或者手机号码返回值:无.NSString* meetingNo =@”当前的会议id”;NSString* meetingnumber =@”要踢出的成员”;ECVoIPAccount *membervVoip = [[ECVoIPAccount alloc] init];
  4. membervVoip.account =  meetingnumber;
  5. membervVoip.isVoip = YES;[[ECDevice sharedInstance].meetingManager removeMemberFromMultMeetingByMeetingType:ECMeetingType_MultiVideo andMeetingNumber: meetingNo andMember: membervVoip completion: (ECError *error, ECVoIPAccount *membervVoip) {//member被移除会议成员的号码
  6.         if (error.errorCode == ECErrorType_NoError)
  7.            { 
  8.                NSLog(@"踢出会议成员"); 
  9.            }
  10.         else
  11.           {
  12.                NSLog(@"踢出会议成员失败"); 
  13.           }}];

视频会议通知消息

当对视频会议进行操作(如主动加入、退出、解散、踢出成员)时,会议室中的相关成员通过视频会议的“通知回调”接口onReceiveMultiVideoMeetingMsg接收相关信息,并进行处理,其代码示例如下:               
                        
  1. -(void)onReceiveMultiVideoMeetingMsg:(ECMultiVideoMeetingMsg *)msg{ECVideoMeetingMsgType type=  msg.type;
  2.    if(msgType==Video_JOIN)
  3.     {
  4.         NSLog(@"有人加入");
  5.     }
  6.     else if(msgType== Video_EXIT)
  7.     {
  8.         NSLog(@"有人退出"); 
  9.     }
  10.     else if(msgType== Video_DELETE)
  11.     {
  12.         NSLog(@"房间被删除退出");
  13.     }
  14.     else if(msgType== Video_REMOVEMEMBER)
  15.    {
  16.         NSLog(@"有人被踢出会议");
  17.     }
  18.     else if(type==Video_PUBLISH)
  19.    {
  20.         NSLog(@"发布视频");
  21.    }
  22.    else if(type==Video_UNPUBLISH)
  23.    {
  24.        NSLog(@"取消发布视频");
  25.     }}                               

获取视频会议列表

获取视频会议列表可以获得应用下的所有音频会议,和获取音频会议列表是同一个接口,其示例代码如下:              
                        
  1. 功能:获取应用下面的语音或视频会议列表。
  2. 参数: Keywords 业务属性
  3.       meetingType 会议的类型
  4. 返回值:无
  5.  
  6. [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType: ECMeetingType_MultiVideo andKeywords:nil completion: (ECError *error, NSArray * meetingList) {
  7.     if (error.errorCode == ECErrorType_NoError)
  8.     { 
  9.         NSLog(@"获取列表成功"); 
  10.     }
  11.     else
  12.     {
  13.         NSLog(@"获取列表失败"); 
  14.     }
  15. }];                                                           

查询当前视频会议成员

用户加入会议后,需要获取当前视频会议中的所有成员,接口和获取音频会议成员的接口一致,传入会议类型参数不同,其示例代码如下: 
                                  
  1. 功能:根据会议类型查询当前会议的成员 
  2. 参数: meetingNo,会议号
  3.        meetingType 会议的类型,回调监听 根据传入的会议类型回调不同的方法。
  4. 返回值:无
  5.  
  6. NSString* meetingNo =@”当前的会议id”;
  7. [[ECDevice sharedInstance].meetingManager queryMeetingMembersByMeetingType: ECMeetingType_MultiVideo andMeetingNumber: meetingNo completion: (ECError *error, NSArray* member){
  8.     //members参与会议的成员数组
  9.     if (error.errorCode == ECErrorType_NoError)
  10.     { 
  11.         NSLog(@"查询会议成员成功"); 
  12.     }
  13.     else
  14.     {
  15.         NSLog(@"查询失败"); 
  16.     }
  17. }];                                                                   

视频会议发布自己的视频

创建或加入视频会议后,需要首先发布自己的视频,其示例代码如下:    
                                    
  1. NSString* meetingNo =@”当前的会议id”;
  2.  [[ECDevice sharedInstance].meetingManager publishSelfVideoFrameInVideoMeeting:meetingNo completion:^(ECError *error, NSString *meetingNumber){
  3.      if (error.errorCode == ECErrorType_NoError)
  4.      { 
  5.          NSLog(@"发布视频成功"); 
  6.      }
  7.      else
  8.      {
  9.          NSLog(@"发布失败"); 
  10.      }
  11. }];               

视频会议取消发布自己的视频

用户想关闭自己的视频(可以看到会议室中其他成员视频),其示例代码如下:    
                                   
  1. NSString* meetingNo =@”当前的会议id”;
  2.  [[ECDevice sharedInstance].meetingManager cancelPublishSelfVideoFrameInVideoMeeting:meetingNo completion:^(ECError *error, NSString *meetingNumber){
  3.      if (error.errorCode == ECErrorType_NoError)
  4.      { 
  5.          NSLog(@"取消发布成功"); 
  6.      }
  7.      else
  8.      {
  9.          NSLog(@"取消发布失败"); 
  10.      }
  11. }];              

视频会议请求某端视频

请求某端视频是要显示会议室中某位成员的视频。我们假设Tony请求John的视频,其示例代码如下:               
                        
  1. NSString* meetingNo =@”当前的会议id”;NSString* meetingPwd =@”所在的会议密码”;NSString* memberNumber =@”John的通讯账号”;
  2. XXXXXX displayView=当成功请求时,展示该成员的窗口[[ECDevice sharedInstance].meetingManager requestMemberVideoWithAccount: memberNumber andDisplayView: displayView andVideoConference: meetingNo andPwd: meetingPwd andPort:port.integerValue completion:^(ECError *error, NSString *meetingNumber, NSString *member) {
  3.        if (error.errorCode == ECErrorType_NoError)
  4.            { 
  5.                NSLog(@"请求成功"); 
  6.            }
  7.         else
  8.           {
  9.                NSLog(@"请求失败"); 
  10.           }
  11. }];
  12. 说明:视频时(包含点对点和会议),设置远端UIView的属性contentMode:(DisplayView: displayView)UIViewContentModeScaleToFill 
  13. //view默认值,图像数据显示,填充view,但不等比例拉伸UIViewContentModeScaleAspectFit //图像等比例拉伸,完全显示内容UIViewContentModeScaleAspectFill //图像等比例拉伸,填充view,部分内容可能不显示                                       

视频会议中取消某一端视频

取消某端视频是在自己的视频会议窗口中不在显示某位成员的视频。我们假设Tony请求John的视频,其示例代码如下:
                                      
  1. NSString* meetingNo =@”当前的会议id”;
  2. NSString* meetingPwd =@”所在的会议密码”;
  3. NSString* memberNumber =@”John的通讯账号”;
  4. XXXXXX displayView=当成功请求时,展示该成员的窗口
  5. [[ECDevice sharedInstance].meetingManager
  6.  cancelConferenceMemberVideoWithAccount: memberNumber
  7.  andVideoConference: meetingNo andPwd: meetingPwd completion:^(ECError *error, NSString *meetingNumber, NSString *member) {
  8.     if (error.errorCode == ECErrorType_NoError)
  9.     { 
  10.         NSLog(@"取消成功"); 
  11.     }
  12.     else
  13.     {
  14.         NSLog(@"取消失败"); 
  15.     }
  16. }];                                                 

禁言禁听功能

管理员有权限决定会议成员是否可听可讲,当不需要某一成员说话或者可听时,此接口可以帮助用户实现。
                                        
  1. /**
  2.  @brief 设置会议某成员是否可听可讲
  3.  @param memberVoip    成员通讯账号
  4.  @param speakListen   是否可听可讲 1、禁言 2、可讲 3、禁听 4、可听
  5.  @param meetingType   会议房间的类型
  6.  @param meetingNumber 房间号
  7.  @param completion    执行结果回调block
  8.  */
  9. ECVoIPAccount *account = “是否是通讯账号”;
  10. NSInteger speakListen = “是否可听可讲”;//1、禁言 2、可讲 3、禁听 4、可听
  11. ECMeetingType meetingType = “会议的类型”;
  12. NSString *meetingNumber = “会议号”;
  13. [[ECDevice sharedInstance].meetingManager setMember:account 
  14. speakListen: speakListen ofMeetingType: meetingType andMeetingNumber: meetingNumber 
  15. completion:^(ECError *error, NSString *meetingNumber) {
  16. }];                                                                   
 禁言禁听设置后,服务器会下发一条通知消息,通知所有人,谁被禁言禁听了。通知消息体增加属性speakListen,视频会议通知是-(void)onReceiveMultiVideoMeetingMsg:(ECMultiVideoMeetingMsg  *)msg                           

分页获取视频会议列表                                        

  1. /**
  2.  @brief 获取音频会议列表
  3.  @param multMeetingType 会议房间的类型
  4.  @param keywords        房间关键字
  5.  @param page            页码
  6.  @param pageSize        房间数
  7.  @param isAsc           是否升序
  8.  @param completion      执行结果回调block
  9.  */
  10. [[ECDevice sharedInstance].meetingManager listAllMultMeetingsByMeetingType: ECMeetingType_MultiVideo 
  11.   andKeywords:nil page:(NSInteger)page pageSize:(NSInteger)pageSize isAsc:(BOOL)isAsc completion: 
  12.    (ECError *error, NSArray * meetingList) {
  13.     if (error.errorCode == ECErrorType_NoError)
  14.     {
  15.          NSLog(@"获取列表成功");
  16.     }
  17.     else
  18.     {
  19.          NSLog(@"获取列表失败");
  20.     }
  21. }];