连麦 - Arcloud/LiveRecorder-Android GitHub Wiki

连麦主要分为主播端和副播端,主播端可以创建连麦,加入连麦,开始连麦,踢出指定副播,停止连麦。副播端只能加入连麦,开始连麦,离开连麦。 这里需要注意主播端与副播端的区别,主播端必须在开始推流之后再进行连麦的创建和加入;副播端开始连麦之前则首先需要启动摄像头,开启预览,然后调用加入连麦接口,不能也不需要开始推流。

1.主播端流程图

主播端分为创建连麦,加入连麦,踢出指定副播,停止连麦,下图为主播端App调用流程图:

2.主播端集成步骤

2.1. 设置连麦监听回调
mCameraRecorder.setLiveChatListener(this);
2.2. 主播创建连麦
mCameraRecorder.createLiveChat(mChannelId, mAnchorId, maccessKey, maccessSerect);
2.3. 向副播发起连麦邀请

主播在onLiveChatInfoCallback回调函数中等待创建连麦成功消息MEDIA_LIVECHAT_INFO_SESSION_CREATED,收到消息后,得到连麦会话Id,向副播发起连麦邀请,同时传入 位置信息 给副播,邀请成功后主播加入连麦会话。注意:邀请副播的逻辑实现需要APP实现。如下代码:

case CameraTypes.MEDIA_LIVECHAT_INFO_SESSION_CREATED : 		
// 连麦会话创建成功,返回连麦会话Id(subInfoId),接下来主播邀请观众加入会话。		
break;
2.4. 加入连麦会话

主播邀请副播成功后,主播加入连麦会话,如下代码: mCameraRecorder.joinLiveChat(mChannelId, mLiveChatId, mAnchorId, mLiveChatUserType, maccessKey, maccessSerect); 加入连麦会话后通过监听回调的消息来判断加入成功还是失败。如果加入成功则会在onLiveChatInfoCallback监听函数中收到MEDIA_LIVECHAT_INFO_SESSION_JOINED消息,在收到消息后,需要设置副播在手机屏幕上的显示位置及区域,并调用如下接口开始连麦:

//开始连麦
if (!mIsLiveChat) {
    mCameraRecorder.startLiveChat();
    mIsLiveChat = true;
}

这里需要注意,所有的连麦者加入连麦其他连麦者都会收到MEDIA_LIVECHAT_INFO_SESSION_JOINED消息,所以APP在这个消息中需要区分当前消息对应的是哪个连麦者,如果是主播自己则不用设置连麦位置,直接开始连麦,如果是副播则调用如下接口设置该连麦者在屏幕上的显示区域: mCameraRecorder.setLiveChatPosition(rect, mLiveChatUserId, CameraTypes.ACCESS_AUDIENCE); 如果加入失败则会通过onLiveChatErrorCallback错误消息,消息类型请参见samplecode, 收到错误消息之后需要关闭退出当前连麦。如下代码:

mCameraRecorder.stopLiveChat();
2.5. 开始连麦

主播加入连麦成功后,开始连麦,如下代码:

//开始连麦
if (!mIsLiveChat) {
    mCameraRecorder.startLiveChat();
    mIsLiveChat = true;
}
2.6. 踢出指定副播

主播可以通过调用如下接口踢出指定的副播:

mCameraRecorder.kickOffLiveChat(mAudienceId);

踢出指定副播后通过监听回调的消息来判断踢出成功还是失败,如果加入成功则会在onLiveChatInfoCallback监听函数中收到MEDIA_LIVECHAT_INFO_SESSION_LEFT消息,在收到消息后APP可以更新UI状态。

2.7. 停止连麦

关闭连麦主播端和副播端的操作是不一样的,说明如下:

  • 如果是主播端关闭连麦:
mCameraRecorder.stopLiveChat();
  • 如果是副播端关闭连麦:
mCameraRecorder.leaveLiveChat();

3. 副播端流程图

副播端分为加入连麦,离开连麦。下图为副播端的APP调用流程图:

4. 副播端集成步骤

4.1. 启动预览

副播端加入连麦之前首先需要开启摄像头及预览功能,如果需要开启美颜则设置美颜参数(美颜参数也可运行过程中动态打开关闭),详细操作如下

  • 初始化cameraRecord引擎,如下代码:
mCameraRecorder = new CameraRecord(this);
  • 通过getSupportPreviewSize()取得手机支持的分辨率列表,然后选择其中一个分辨率设置到录制属性中,注意:cameraConfig中的录制分辨率必须设置为手机支持的分辨率,如果设置错误,会导致下面预览失败或者花屏等错误。如下代码:
mSupportSizes = mCameraRecorder.getSupportPreviewSize();
mOptimalPreviewSize = getOptimalPreviewSize(mSupportSizes, VIDEO_WIDTH, VIDEO_HEIGHT);
mCameraConfig.setVideoWidth(mOptimalPreviewSize.width);
mCameraConfig.setVideoHeight(mOptimalPreviewSize.height);
mCameraConfig.setVideoBitRate((int)(mOptimalPreviewSize.width * mOptimalPreviewSize, height * 2));
  • 初始化CameraSurfaceView,并设置到推流引擎中,如下代码:
mSurfaceView = (CameraSurfaceView) findViewById(R.id.continuousCapture_surfaceView);
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
mSurfaceView.init(this, mCameraRecorder.getCameraManager(), mCameraConfig, mWindowWidth, mWindowHeight);
mCameraRecorder.setCameraSurfaceView(mSurfaceView);
  • 设置录制参数,如前置后置,显示模式,自动对焦,缩放,水印等,如下代码:
CameraRecorder.SetCameraFacingType(mCameraFacing);
mCameraRecorder.setCameraDisplayMode(CameraTypes.FILL_IN);
mCameraRecorder.enableAutoFoucs(true);
mCameraRecorder.enableZoom(true);
mCameraRecorder.setWaterMark(bitmap,CameraTypes.RIGHT_TOP);
  • 设置连麦监听回调,如下代码
mCameraRecorder.setLiveChatListener(this);
  • 如果是activity则上述操作在oncreate中进行,接下来开启preview并画屏,打开预览,请在OnResume函数中执行,如下代码:
mSurfaceView.setVisibility(View.VISIBLE);
mCameraRecorder.openCamera(mCameraConfig)
  • 设置美颜,设置美颜模式需要在预览成功之后,请用isCameraSurfaceCreated()函数得到当前CameraSurfaceView的状态,当为true时表明预览成功,此时可以设置美颜模式;反之,当为false时表明预览失败,此时不能设置美颜模式,如下代码:
if (mCameraRecorder.isCameraSurfaceCreated()) 
    mCameraRecorder.enableFaceBeauty(true);

4.2. 加入连麦

在摄像头开启之后,即可加入到连麦,副播端加入连麦只需要调用如下函数即可,然后通过监听回调的消息来判断加入成功还是失败。

mCameraRecorder.joinLiveChat(mChannelId, mLiveChatId, mAudienceId, mLiveChatUserType, maccessKey,maccessSerect);

如果加入成功则会在onLiveChatInfoCallback监听函数中收到MEDIA_LIVECHAT_INFO_SESSION_JOINED消息,在收到消息后,需要设置当前副播在手机屏幕上的显示位置及区域,设置好了之后就可以开始连麦了,接口如下:

    	mCameraRecorder.setLiveChatAudiencePreview(rect);
	//开始连麦
	if (!mIsLiveChat) {
	   mCameraRecorder.startLiveChat();
	   mIsLiveChat = true;
	}

这里需要注意,所有的连麦者加入连麦其他连麦者都会收到MEDIA_LIVECHAT_INFO_SESSION_JOINED消息,所以APP在这个消息中需要区分当前消息对应的是哪个连麦者,只有对应的是当前副播自己时才需要进行如上接口调用,如果加入的是另外一个连麦者,则需要调用如下接口设置该连麦者在屏幕上的显示区域:

  • 如果是主播:
mCameraRecorder.setLiveChatPosition(rect, mLiveChatUserId, CameraTypes.ACCESS_ANCHOR);
  • 如果是其它副播:
mCameraRecorder.setLiveChatPosition(rect, mLiveChatUserId, CameraTypes.ACCESS_AUDIENCE);

如果加入失败则会通过onLiveChatErrorCallback错误消息,消息类型请参见samplecode, 收到错误消息之后需要关闭退出当前连麦,调用接口如下:

mCameraRecorder.leaveLiveChat();

4.3. 开始连麦

副播加入连麦成功后,则可以开始连麦了,如下代码:

//开始连麦
if (!mIsLiveChat) {
    mCameraRecorder.startLiveChat();
    mIsLiveChat = true;
}

4.4. 离开连麦

关闭连麦副播端的操作和主播端是不一样的,如下代码:

mCameraRecorder.leaveLiveChat();