Skip to content

multi_user_window_rect

Su, Jia edited this page Jan 3, 2018 · 3 revisions

多人连麦窗口显示

多人连麦效果图如下:
v2.0_demo

1. 图像融合方法

  连麦时本地和remote图像使用金山推流SDK的[[ImgTexMixer|http://ksvc.github.io/KSYStreamer_Android/docs/reference/com/ksyun/media/streamer/filter/imgtex/ImgTexMixer.html]]进行融合,显示(预览)在一个GLSurfaceView内。   

  ImgTexMixer在使用时需要注意的是:  
  - The mixer operation occurred while the frame with main index number arrived   
  - Has maximum getSinkPinNum() input pins   
  - the lower sink pin index number means the lower frame z order, 
      that is, the higher sink pin index frame shown in top of lower ones
  1. 修改Mixer中窗口的位置及大小 对于ImgTexMixer的输入sink pin index,修改其窗口大小和位置的方法如下
    //mImgTexMixer融合后数据送去编码
    mImgTexMixer.setRenderRect(index, top, left, width, height, 1.0f);
    //mImgTexPreviewMixer融合后数据用于预览
    mImgTexPreviewMixer.setRenderRect(index, top, left, width, height, 1.0f);

2. 多人连麦kit类窗口呈现方式

demo中mixer sink pin定义如下:

   //pin 0用于背景图图片展示
   protected int mIdxBgPicture = 0;

   //pin 0-4 用做背景图以及rtc画面
   
   //pin 5-6用于水印
   mIdxWmLogo = 5;
   mIdxWmTime = 6;

demo中只支持4人连麦,窗口显示对应代码如下:

   public void updateRTCScreen() {
        List<Integer> userList = mRTCClient.getUserList();
        if ( userList != null) {
            //远端用户人数
            int remote_user_count = userList.size();
            //默认先连接remote user,camera作为左后一个index
            int camera_index = remote_user_count < KMCMultiUserRTCClient.MAX_REMOTE_USER ?
                    remote_user_count + 1 : KMCMultiUserRTCClient.MAX_REMOTE_USER + 1;
            int remote_user_start_idx = 1;

            //当以camera作为主屏幕(大窗口)显示时,将camera index设置为背景图(0)后第一个index
            if (remote_user_count == 1 &&
                    mRTCMainScreen == RTC_MAIN_SCREEN_CAMERA) {
                camera_index = 1;
                remote_user_start_idx = 2;
            }

            //顺序连接remote user和mixer的对应管脚
            for (int i = 0; i < remote_user_count &&
                    i < KMCMultiUserRTCClient.MAX_REMOTE_USER; i++) {
                int uid = userList.get(i);
                ImgTexSrcPin srcPin = mRTCClient.getImgTexSrcPin(uid);
                srcPin.disconnect(false);
                int index = i + remote_user_start_idx;
                srcPin.connect(mImgTexMixer.getSinkPin(index));
                srcPin.connect(mImgTexPreviewMixer.getSinkPin(index));
            }

            mImgTexFilterMgt.getSrcPin().disconnect(false);
            mImgTexFilterMgt.getSrcPin().connect(mRTCImgTexScaleFilter.getSinkPin());
            mImgTexFilterMgt.getSrcPin().connect(mImgTexMixer.getSinkPin(camera_index));
            mImgTexFilterMgt.getSrcPin().connect(mImgTexPreviewMixer.getSinkPin(camera_index));
            mImgTexMixer.setMainSinkPinIndex(camera_index);
            mImgTexPreviewMixer.setMainSinkPinIndex(camera_index);

            int mode  = SCALING_MODE_CENTER_CROP;
            if (remote_user_count == 0) {
                //只有自己,camera全屏
                setMixerRect(camera_index, 0.f, 0.f, 1.f, 1.f, mode);
            } else if (remote_user_count == 1) {
                //两人连麦的窗口位置及大小根据设置进行
                if (mRTCMainScreen == RTC_MAIN_SCREEN_REMOTE) {
                    //remote user画面作为主屏幕
                    setMixerRect(1, mPresetMainLeft, mPresetMainTop,
                            mPresetMainWidth, mPresetMainHeight, mPresetMainMode);
                    setMixerRect(2, mPresetSubLeft, mPresetSubTop,
                            mPresetSubWidth, mPresetSubHeight, mPresetSubMode);
                } else {
                    //本地camera画面作为主屏幕
                    setMixerRect(1, mPresetMainLeft, mPresetMainTop,
                            mPresetMainWidth, mPresetMainHeight, mPresetMainMode);
                    setMixerRect(2, mPresetSubLeft, mPresetSubTop,
                            mPresetSubWidth, mPresetSubHeight, mPresetSubMode);
                }
            } else if (remote_user_count == 2) {
                //3人连麦,remote user平分屏幕上半部分, camera居中显示在下半部分
                setMixerRect(1, 0.f, 0.f, 0.5f, 0.5f, mode);
                setMixerRect(2, 0.5f, 0.f, 0.5f, 0.5f, mode);
                setMixerRect(3, 0.25f, 0.5f, 0.5f, 0.5f, mode);
            } else if (remote_user_count >= KMCMultiUserRTCClient.MAX_REMOTE_USER) { //demo最多支持4人连麦
                //4人连麦,4人4等分屏幕,camera显示在右下角
                setMixerRect(1, 0.f, 0.f, 0.5f, 0.5f, mode);
                setMixerRect(2, 0.5f, 0.f, 0.5f, 0.5f, mode);
                setMixerRect(3, 0.f, 0.5f, 0.5f, 0.5f, mode);
                setMixerRect(4, 0.5f, 0.5f, 0.5f, 0.5f, mode);
            }
        }
    }

3. 人数控制

由于demo中只支持4人连麦,需要app开发者在业务层控制房间内人数  

4. 自定义

如需支持4人以上连麦,或者自定义多人连麦窗口显示方式,可自行修改[[KMCMultiUserRTCStreamer|https://github.com/ksvcmc/KMCAgoraVRTC_Android/blob/master/demo/src/main/java/com/ksyun/mc/AgoraVRTCDemo/kit/KMCMultiUserRTCStreamer.java]]