互联网多人视频
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(@"获取列表失败");
- }
- }];