互联网多人视频

1、互联网多人视频说明          

视频会议只是多人参加的基于互联网、或者基于电话或者网络和电话混合的会议。               
1.1、接口逻辑
接口调用是采取“请求回调”和“通知回调”的方式和服务端交互。在对应的sdk的方法参数中有“请求回调”方法,请求的结果直接在参数的回调方法中处理。会议中的成员收到服务端发送过来的消息通过“通知回调”方法onReceiveVideoMeetingMsg(ECVideoMeetingMsg  msg)来接收并进行处理。              
1.2、业务流程
(1)用户A创建视频会议。                
(2)会议创建成功之后,邀请其他成员加入会议。                
(3)其他成员收到邀请,同意或拒绝加入会议。                
(4)在视频会议中发布自己的视频会议图像。                
(5)在视频会议中请求/取消成员的视频图像。                
(6)管理员对视频已加入视频会议成员进行管理(如:移除出会议)。                
(7)管理员解散视频会议/成员退出视频会议。                   

2、互联网多人视频操作代码示例                           

创建视频会议

我们假设Tony要创建视频会议,其示例代码如下:             
                        
  • // 初始化创建会议所需要的参数
  • ECMeetingManager.ECCreateMeetingParams.Builder builder = new ECMeetingManager.ECCreateMeetingParams.Builder();
  •          //设置语音会议房间名称
  • builder.setMeetingName("meetingName)
  •          // 设置视频会议创建者退出是否自动解散会议
  •         .setIsAutoClose("IsAutoClose")
  •         // 设置视频会议创建成功是否自动加入
  •         .setIsAutoJoin("IsAutoJoin")
  •         // 设置视频会议背景音模式
  •         .setVoiceMod("VoiceMod")
  •         // 设置视频会议所有成员退出后是否自动删除会议
  •         .setIsAutoDelete("IsAutoDelete");
  • ECMeetingManager.ECCreateMeetingParams params = builder.create();
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • meetingManager.createMultiMeetingByType(params, 
  •         ECMeetingManager.ECMeetingType. MEETING_MULTI_VIDEO
  •         new ECMeetingManager.OnCreateOrJoinMeetingListener() {
  •             @Override
  •             public void onCreateOrJoinMeeting(ECError reason, String meetingNo) {
  •                 if (reason.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                     //创建会议成功
  •                     return ;
  •                 }
  •                 Log.e("ECSDK_Demo" , "create video meeting error[" 
  •                         + error.errorCode + " ]");
  •             }
  •         });                                                      

邀请成员加入会议

我们假设Tony创建视频会议成功之后,邀请John和Smith加入视频会议,其代码如下:
                                        
  • // 封装需要邀请加入会议的成员
  • String members[]={"John的账号","Smith的账号"};
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起邀请加入会议请求
  • meetingManager.inviteMembersJoinToMeeting("meetingNo", members, "isLandingCall",
  •         new ECMeetingManager.OnInviteMembersJoinToMeetingListener() {
  •             @Override
  •             public void onInviteMembersJoinToMeeting(ECError reason, String meetingNo) {
  •                 if (reason.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                     // 邀请加入会议成功
  •                     return ;
  •                 }
  •                 Log.e("ECSDK_Demo" , "invite member error["
  •                         + error.errorCode + " ]");
  •             }
  •         });        

主动加入会议

我们假设Eric要主动加入视频会议,其示例代码如下:
                                     
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();// 发起加入会议请求[如果会议需要验证密码则需要输入会议密码]
  • meetingManager.joinMeetingByType("meetingNo", "password",
  •         ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO,
  •         new ECMeetingManager.OnCreateOrJoinMeetingListener() {
  •             @Override
  •             public void onCreateOrJoinMeeting(ECError reason, String meetingNo) {
  •                 if (reason.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                     // 加入会议成功
  •                     return;
  •                 }
  •                 Log.e("ECSDK_Demo", "join meeting error["
  •                         + error.errorCode + " ]");
  •             }
  •         });               

通过会议类型解散视频会议

我们假设Tony要解散自己创建的一个视频会议,其示例代码如下:                
                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起解散会议请求
  • meetingManager.deleteMultiMeetingByType (ECMeetingType.MEETING_MULTI_VIDEO,
  •         "meetingNo", new ECMeetingManager.OnDeleteMeetingListener() {
  •             @Override
  •             public void onMeetingDismiss(ECError reason, String meetingNo) {
  •                 if (reason.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                     // 解散会议成功
  •                     return;
  •                 }
  •                 Log.e("ECSDK_Demo", "del meeting error["
  •                         + error.errorCode + " ]");
  •             }
  •         });                                                                    

退出视频会议

退出会议,其示例代码如下:
                                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起退出视频会议请求
  • meetingManager.exitMeeting(ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO);                                                  

视频会议踢出会议成员

只有会议创建者才能踢出成员,我们假设Tony要踢出John,isMobile标识John是否以落地电话的形式加入或者视频来电方式加入。其示例代码如下:             
                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起视频会议移除成员请求
  • meetingManager.removeMemberFromMultiMeetingByType(
  •         ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO,
  •         "meetingNo", "john", "isMobile",
  •         new ECMeetingManager.OnRemoveMemberFromMeetingListener() {
  •             @Override
  •             public void onRemoveMemberFromMeeting(ECError reason, String member) {
  •                 if (SdkErrorCode.REQUEST_SUCCESS == reason.errorCode) {
  •                     // 移除会议成员成功
  •                     return ;
  •                 }
  •                 Log.e("ECSDK_Demo", "del meeting member error["
  •                         + error.errorCode + " ]");
  •             }
  •         });                                                                           

获取视频会议列表

通过“获取视频会议列表”接口,可以获得应用下的所有视频会议列表,其示例代码如下:                
                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起查询视频会议请求
  • meetingManager.listAllMultiMeetingsByType("keyword",
  •         ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO,
  •         new ECMeetingManager.OnListAllMeetingsListener<ECMeeting>() {
  •             @Override
  •             public void onListAllMeetings(ECError reason, List<ECMeeting> list) {
  •                 if (SdkErrorCode.REQUEST_SUCCESS == reason.errorCode) {
  •                     // 查询会议成功
  •                     return;
  •                 }
  •                 Log.e("ECSDK_Demo", "query meetings error["
  •                         + error.errorCode + " ]");
  •             }
  •         });               

查询当前视频会议成员

用户加入会议后,需要获取当前视频会议中的所有成员,其示例代码如下:                
                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 发起查询视频会议成员请求
  • meetingManager.queryMeetingMembersByType("meetingNo",
  •         ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO,
  •         new ECMeetingManager.OnQueryMeetingMembersListener<ECVideoMeetingMember>() {
  •             @Override
  •             public void onQueryMeetingMembers(ECError reason, List<ECVideoMeetingMember> members) {
  •                 if (SdkErrorCode.REQUEST_SUCCESS == reason.errorCode) {
  •                     // 查询视频会议成员成功
  •                     return;
  •                 }
  •                 Log.e("ECSDK_Demo", "query meeting member error["
  •                         + error.errorCode + " ]");
  •             }
  •         });

视频会议发布自己的视频图像

我们假设Tony要发布自己的视频图像,其示例代码如下:                
                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 调用发布视频会议图像接口
  • meetingManager.publishSelfVideoFrameInVideoMeeting("Tony所在会议的会议号",
  •       new OnSelfVideoFrameChangedListener() {
  •    @Override
  •    public void onSelfVideoFrameChanged(boolean isPublish, ECError error) {
  •       if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •          // 发布视频会议图像成功
  •          // isPublish 表示当前是否是发布视频会议请求
  •          // isPublish = true表示请求发布视频会议图像接口回调
  •          return ;
  •       }
  •       Log.e("ECSDK_Demo" , "publish sel video error[" + error.errorCode
  •             + " ]");
  •    }});

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

我们假设Tony要取消发布自己的视频图像,其示例代码如下: 
                                    
  • //  获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 调用取消发布视频会议图像接口
  • meetingManager.cancelPublishSelfVideoFrameInVideoMeeting("Tony所在会议的会议号",
  •       new OnSelfVideoFrameChangedListener() {
  •          @Override
  •          public void onSelfVideoFrameChanged(boolean isPublish, ECError error) {
  •             if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                // 取消视频会议图像成功
  •                // isPublish 表示当前是否是发布视频会议请求
  •                // isPublish = false表示取消发布视频会议图像接口回调
  •                return ;
  •             }
  •             Log.e("ECSDK_Demo" , "cancel publish sel video error[" + error.errorCode
  •                   + " ]");
  •          }
  •       });                    

请求视频会议成员图像接口

我们假设Tony要请求成员John的视频图像,其代码如下:
                                        
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 调用请求视频会议成员图像接口
  • // meetingNo :所在的会议号
  • // meetingPwd :所在的会议密码
  • // account :需要请求视频的成员账号,比如需要请求John的视频图像则 account 为John账号
  • // displayView :视频图像显示View
  • // ip和port :成员视频图像所在的IP地址和端口可以参考ECVideoMeetingMember.java和ECVideoMeetingJoinMsg.java 参数

  • meetingManager.requestMemberVideoInVideoMeeting("meetingNo", "meetingPwd",
  •       "account", "displayView ", "ip", 'port',
  •       new OnMemberVideoFrameChangedListener() {
  •          @Override
  •          public void onMemberVideoFrameChangedFailed(ECError error,
  •                                           boolean isRequest,
  •                                           String meetingNo,
  •                                           String account) {

  •             if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                // 请求成员视频图像成功
  •                // isRequest 表示当前是否是对应请求视频图像请求
  •                // isRequest = true表示对应请求视频图像回调
  •                // meetingNo 当前视频成员所在的视频会议号
  •                // account 所请求的视频成员账号
  •                return ;
  •             }
  •             Log.e("ECSDK_Demo" , "request member video error[" + 
  •                   error.errorCode + " ]");
  •          }
  •       });                            

取消视频会议成员图像接口

我们假设Tony需要取消视频会议成员John的视频图像,其代码如下:
                                       
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 调用取消视频会议成员图像接口
  • // meetingNo :所在的会议号
  • // meetingPwd :所在的会议密码
  • // account :需要取消视频的成员账号,比如需要请求John的视频图像则 account 为John账号
  • meetingManager.cancelRequestMemberVideoInVideoMeeting("meetingNo", "meetingPwd",
  •       "account",  new OnMemberVideoFrameChangedListener() {
  •               // v5.1.8r版本
  •          @Override
  •          public void onMemberVideoFrameChangedFailed(ECError error,
  •                                           boolean isRequest,
  •                                           String meetingNo,
  •                                           String account) {

  •             if(error.errorCode == SdkErrorCode.REQUEST_SUCCESS) {
  •                // 取消成员视频图像成功
  •                // isRequest 表示当前是否是对应请求/取消视频图像请求
  •                // isRequest = false表示对应取消视频图像回调
  •                // meetingNo 当前视频成员所在的视频会议号
  •                // account 所请求的视频成员账号
  •                return ;
  •             }

  •             Log.e("ECSDK_Demo" , "cancel member video error[" + 
  •                   error.errorCode + " ]");

  •          }
  •       });
  •       
  • 注意:从v5.1.9r版本开始,将回调方法修改为:
  • /**
  •  * 在视频会议中获取或者取消实时获取某一成员视频图像请求失败回调接口
  •  */
  • interface OnMemberVideoFrameChangedListener{

  •         /**
  •          * 当调用接口{@link #requestMemberVideoInVideoMeeting(String, String, String, View, String, int, 
  •          *                   OnMemberVideoFrameChangedListener)} 实时获取,某一成员
  •          * 视频图象以及{@link #cancelRequestMemberVideoInVideoMeeting(String, String, String, 
  •          *                  OnMemberVideoFrameChangedListener)} 取消实时获取某一成员
  •          * 视频图像时,SDK会通过该回调方法通知应用接口调用结果。
  •          * @param isRequest 是否是获取或者是取消获取视频图像请求
  •          * @param reason 接口执行失败错误码
  •          * @param meetingNo 视频会议号
  •          * @param account 执行该操作对应的成员账号
  •          */
  •         void onMemberVideoFrameChanged(boolean isRequest, ECError reason, String meetingNo, String account);}                                                    

切换/重置当前视频成员图像显示窗口接口

我们假设Tony要将视频成员[John]的视频图像切换到另一个View显示,则代码如下:
                                       
  • // 获取一个会议管理接口对象
  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  • // 调用切换/重置当前视频成员图像显示窗口接口
  • // account :John的账号
  • // displayView :新的视频图像显示窗口
  • int ret = meetingManager.resetVideoMeetingWindow("account", "displayView");if(ret == 0) {
  •    // 切换请求执行成功
  •    return ;}
  •    // 失败[ -1(不支持视频) 170012(账号号为NULL) -3(displayView为NULL) -4(找不到该账号相关的资料)]
  •    Log.e("ECSDK_Demo" , "reset member video window error[" + ret + " ]");                                    
                                   

视频会议通知消息

当对视频会议进行操作(如邀请,主动加入、退出、解散、踢出成员)时,会议室中的相关成员通过语音会议的“通知回调”接口,其示例代码如下:                                      
  • @Overridepublic void onReceiveVideoMeetingMsg(ECVideoMeetingMsg msg) {
  •    switch (msg.getMsgType()) {
  •         case JOIN:
  •             // 视频会议消息类型-有人加入
  •             ECVideoMeetingJoinMsg joinMsg = (ECVideoMeetingJoinMsg) msg;
  •             break;
  •         case EXIT:
  •             // 视频会议消息类型-有人退出
  •             ECVideoMeetingExitMsg exitMsg = (ECVideoMeetingExitMsg) msg;
  •             break;
  •         case DELETE:
  •             // 视频会议消息类型-会议结束
  •             ECVideoMeetingDeleteMsg delMsg = (ECVideoMeetingDeleteMsg) msg;
  •             break;
  •         case REMOVE_MEMBER:
  •             // 视频会议消息类型-成员被移除
  •             ECVideoMeetingRemoveMemberMsg rMsg =
  •                     (ECVideoMeetingRemoveMemberMsg) msg;
  •             break;
  •         case SWITCH:
  •             // 视频会议消息类型-主屏切换
  •             ECVideoMeetingSwitchMsg sMsg = (ECVideoMeetingSwitchMsg) msg;
  •             break;
  •         case VIDEO_FRAME_ACTION:
  •             // 视频会议消息类型-成员图象发布或者取消发布
  •             ECVideoMeetingVideoFrameActionMsg actionMsg =
  •                     (ECVideoMeetingVideoFrameActionMsg) msg;
  •             break;
  •         case REJECT:
  •             // 视频会议消息类型-成员拒绝邀请加入会议请求
  •             ECVideoMeetingRejectMsg rejectMsg = 
  •                     (ECVideoMeetingRejectMsg) msg;
  •             break;
  •         default:
  •             Log.e("ECSDK_Demo" , "can't handle notice msg "
  •                     + msg.getMsgType() );
  •             break;
  •     }          

视频会议成员图像分辨率改变通知              

  • // 标识对方视频图像到达,本地可以做一些操作,比如显示对方的视频控件等等
  • @Override
  • public void onVideoRatioChanged(VideoRatio videoRatio) {
  •           // 视频通话/视频会议中,对方视频图像分辨率发生改变,回调该接口通知
  •           // 当前视频分辨率发生改变所属的通话Id或者视频会议号
  •           String callId = videoRatio.getCallId();
  •           // 视频图像分辨率改变后的宽
  •           int width = videoRatio.getWidth();
  •           // 视频图像分辨率改变后的高
  •           int height = videoRatio.getHeight();
  •           // 当前是否是视频会议
  •           boolean meeting = videoRatio.isMeeting();
  •           // 如果当前是视频会议则表示发生改变的视频会议成员账号
  •           // 如果是视频通话,则当前字段为null
  •           String account = videoRatio.getAccount();
  •       }

设置视频会议成员禁言、禁听状态                                   

  • ECMeetingManager meetingManager = ECDevice.getECMeetingManager();
  •             if(meetingManager==null){
  •                 return;
  •             }
  •            meetingManager.setMemberSpeakListen(account, type, meetingNum, meetingType, new 
  •            ECMeetingManager.OnSetMemberSpeakListenListener() {
  •             @Override
  •             public void onSetMemberSpeakListenResult(ECError error, String meetingNum) {
  •                 
  •                 if(error.errorCode==SdkErrorCode.REQUEST_SUCCESS){
  •                     
  •                     Log.d(TAG,"设置成功");
  •                 }else {
  •                     Log.d(TAG,"设置失败");
  •                 }
  •             }
  •         });                                                           

分页获取视频会议列表                                       

  • /**
  •      * ECMeetingManager类
  •      * 获取会议列表时、支持分页功能
  •      * @param keywords    查询关键词
  •      * @param meetingType  查询的会议类型
  •      * @param match        分页参数
  •      * @param listener     执行结果回调
  • */
  • ECMeetingPageMatch match = new ECMeetingPageMatch();
  • match.setPage(1);
  • match.setPageSize(10)
  • ECDevice.getECMeetingManager().listPageMultiMeetingsByType("keywords", 
  •      ECMeetingManager.ECMeetingType.MEETING_MULTI_VIDEO, match, 
  •               new ECMeetingManager.OnListPageMeetingsListener(){
  •        @Override
  •        public void onListAllMeetings(ECError ecError, ECMeetingPageMatchResult ecMeetingPageMatchResult, 
  •                          List list){
  •                                  // 处理消息发送结果
  •             }
  •         });