-
Notifications
You must be signed in to change notification settings - Fork 1
multi_user_window_rect
Su, Jia edited this page Jan 3, 2018
·
3 revisions
多人连麦效果图如下:
连麦时本地和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
- 修改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);
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);
}
}
}
由于demo中只支持4人连麦,需要app开发者在业务层控制房间内人数
如需支持4人以上连麦,或者自定义多人连麦窗口显示方式,可自行修改[[KMCMultiUserRTCStreamer|https://github.com/ksvcmc/KMCAgoraVRTC_Android/blob/master/demo/src/main/java/com/ksyun/mc/AgoraVRTCDemo/kit/KMCMultiUserRTCStreamer.java]]