互联网多人视频

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要创建视频会议,其示例代码如下:                                        
  • 功能:创建语音、视频会议。
  • 参数: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(@"会议创建失败,稍后重试"); 
  •               } 
  •           }];                                                              

主动加入视频会议

主动加入视频会议和加入音频会议是同一个接口,只是传入参数的类型不同,同时需要注意视频窗口的创建,我们假设Eric要主动加入视频会议,其示例代码如下:                                     
  • 功能:通过会议类型加入会议。
  • 参数: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(@"加入会议失败"); 
  •     } 
  • }];                                                       

解散视频会议

解散视频会议我们假设Tony要解散自己创建的一个会议,其示例代码如下:                                     
  • 功能:通过会议类型加入会议。
  • 参数: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(@"解散会议失败"); 
  •     }
  • }];            

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

视频会议邀请成员加入,只有会议创建者才能邀请成员,我们假设Tony要邀请John,其示例代码如下:                                        
  • 功能: 邀请成员加入视频会议 
  • 参数: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]                                              

视频会议踢出会议成员

视频会议踢出会议成员和音频会议踢出会议成员是同一个接口,只是传入会议类型不同。只有会议创建者才能踢出成员,我们假设Tony要踢出John,其示例代码如下:                
                        
  • 功能:从语音、视频会议移除成员 参数:
  • 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(@"踢出会议成员失败"); 
  •           }}];

视频会议通知消息

当对视频会议进行操作(如主动加入、退出、解散、踢出成员)时,会议室中的相关成员通过视频会议的“通知回调”接口onReceiveMultiVideoMeetingMsg接收相关信息,并进行处理,其代码示例如下:               
                        
  • -(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(@"取消发布失败"); 
  •      }
  • }];              

视频会议请求某端视频

请求某端视频是要显示会议室中某位成员的视频。我们假设Tony请求John的视频,其示例代码如下:               
                        
  • 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,部分内容可能不显示                                       

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

取消某端视频是在自己的视频会议窗口中不在显示某位成员的视频。我们假设Tony请求John的视频,其示例代码如下:
                                      
  • 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) {
  • }];                                                                   
 禁言禁听设置后,服务器会下发一条通知消息,通知所有人,谁被禁言禁听了。通知消息体增加属性speakListen,视频会议通知是-(void)onReceiveMultiVideoMeetingMsg:(ECMultiVideoMeetingMsg  *)msg                           

分页获取视频会议列表                                        

  • /**
  •  @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(@"获取列表失败");
  •     }
  • }];