跨房间连麦
跨房间连麦中需要区分主房间和副房间概念。主副房间是相对概念,定义如下:
- 主房间:本端在最开始加入的房间,即 RCRTCRoom。
- 副房间:在连麦邀请被接受后,双方均需要加入对方房间。对方房间即:RCRTCOtherRoom。
跨房间连麦前需要双方都已经加入自己的主房间,未加入主房间前无法进行连麦的邀请和被邀请。
两种房间的类都有对应的代理 IRCRTCRoomEventsListener 和 IRCRTCOtherRoomEventsListener 用来区分不同类型房间的回调。
主流程
发起邀请
向指定用户发送跨房间连麦请求,使用加入房间成功回调返回的 RCRTCRoom
类获取 RCRTCLocalUser
对象,调用 requestJoinOtherRoom
方法。
-
代码示例:
Java/**
* 向指定用户发送跨房间连麦请求
* <P>
* 1: inviterAutoMix为true时:
*
* 1.1:如果被邀请方在加 入邀请方房间之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把被邀请方流资源合并到邀请方视图 ·(默认仅悬浮布局合流)上。
*
* 1.2:如果被邀请方在加入邀请方房间之前没有发布过资源,将会在被邀请方发布资源成功后,服务器会把被邀请方流资源合并到邀请方视图(默认仅悬浮布局合流)上。
*
* 2:无论为true或false,双方都可以使用{@link RCRTCLiveInfo#setMixConfig(RCRTCMixConfig, IRCRTCResultCallback)} 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。
* <P/>
*/
RCRTCRoom.getLocalUser().requestJoinOtherRoom(inviteeRoomId, inviteeUserId, inviterAutoMix, "extra", new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
}); -
API 参考:
取消邀请
收到其他房间主播连麦邀请后,如果不打算加入,则调用 RCRTCLocalUser
中的 cancelRequestJoinOtherRoom
来取消正在进行中的跨房间连麦请求。
-
代码示例:
JavaRCRTCRoom.getLocalUser().cancelRequestJoinOtherRoom(inviteeRoomId, inviteeUserId, "extra", new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
}); -
API 参考:
应答邀请
收到其他房间主播连麦邀请后,如果打算加入,则需要先调用 RCRTCLocalUser
中的 responseJoinOtherRoom
来响应跨房间麦连麦邀请,再调用 joinOtherRoom
加入副房间。
-
代码示例:
Java/**
* <P>
* 1:inviteeAutoMix 为true时:
*
* 1.1:如果邀请方在发送连麦请求之前发布了资源,当被邀请方加入邀请者房间成功后,服务器会把邀请方流资源合并到被邀请方视图(默认仅悬浮布局合流)上。
*
* 1.2:如果邀请方在发送连麦请求之前没有发布资源,将会在邀请方发布资源成功后,服务器才会把邀请方的资源合并到被邀请方视图(默认仅悬浮布局合流)上。
*
* 2: 无论为true或false,双方都可以使用{@link RCRTCLiveInfo#setMixConfig(RCRTCMixConfig, IRCRTCResultCallback)} 方法主动设置合流布局。一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。
*
* <P/>
*/
RCRTCRoom.getLocalUser().responseJoinOtherRoom(inviterRoomId, inviterUserId, agree, inviteeAutoMix, "extra", new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
}); -
API 参考:
加入副房间
-
代码示例:
JavaRCRTCEngine.getInstance().joinOtherRoom(roomId, new IRCRTCResultDataCallback<RCRTCOtherRoom>() {
@Override
public void onSuccess(RCRTCOtherRoom rcrtcOtherRoom) {
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
}
}); -
API 参考:
注册其他房间事件监听
-
在加入其他房间成功后的回调中,可以得到
RCRTCOtherRoom
对象,调用其中的registerOtherRoomEventsListener
即可注册其他房间事件监听。当有其他房间主播加入、离开、发布资源后会触发此监听回调,在回调中订阅用户音视频资源,可进行音视频通话。 -
在不使用或退出房间之前需取消注册
RCRTCOtherRoom.unregisterOtherRoomEventsListener
。JavaRCRTCOtherRoom.registerOtherRoomEventsListener(new IRCRTCOtherRoomEventsListener() {
/**
* 其他房间内用户发布资源
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
* @param list 发布的资源
*/
@Override
public void onRemoteUserPublishResource(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser, List<RCRTCInputStream> list) {}
/**
* 其他房间用户发布的音频资源静音或者取消静音
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
* @param rcrtcInputStream 音频流
* @param mute true表示静音,false表示取消静音
*/
@Override
public void onRemoteUserMuteAudio(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser, RCRTCInputStream rcrtcInputStream, boolean mute) {}
/**
* 远端用户打开或关闭发布的视频流。 例如用户开启或者关闭摄像头
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
* @param rcrtcInputStream 视频流
* @param mute true表示关闭,false表示打开
*/
@Override
public void onRemoteUserMuteVideo(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser, RCRTCInputStream rcrtcInputStream, boolean mute) {}
/**
* 房间内用户取消发布资源
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
* @param list 远端用户取消发布的资源
*/
@Override
public void onRemoteUserUnpublishResource(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser, List<RCRTCInputStream> list) {}
/**
* 用户加入房间
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
*/
@Override
public void onUserJoined(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser) {}
/**
* 用户离开房间
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
*/
@Override
public void onUserLeft(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser) {}
/**
* 用 户离线
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param rcrtcRemoteUser 远端用户
*/
@Override
public void onUserOffline(RCRTCOtherRoom rcrtcOtherRoom, RCRTCRemoteUser rcrtcRemoteUser) {}
/**
* 自己退出其他房间。 例如断网退出等
*
* @param rcrtcOtherRoom 加入的其他房间对象
* @param reasonCode 状态码
*/
@Override
public void onLeaveRoom(RCRTCOtherRoom rcrtcOtherRoom, int reasonCode) {}
});
离开副房间
当需要结束跨房间连麦时,调用 RCRTCEngine
中的 leaveOtherRoom
离开副房间。
-
代码示例:
JavaRCRTCEngine.getInstance().leaveOtherRoom(roomId, notifyFinished, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
}
}); -
API 参考:
邀请连麦流程
-
场景一,邀请方发起邀请后,邀请方又取消邀请。
提示此场景中被邀请方未做任何操作,仅被动收到两次代理回调。
邀请方 | 被邀请方 |
---|---|
步骤1:调用 RCRTCLocalUser 类中的 requestJoinOtherRoom 方法发起跨房间连麦邀请 | 步骤2:在 IRCRTCRoomEventsListener 中收到 onRequestJoinOtherRoom 邀请回调 |
步骤3:调用 RCRTCLocalUser 类中的 cancelRequestJoinOtherRoom 方法结束之前发起的邀请 | 步骤4:在 IRCRTCRoomEventsListener 中收到 onCancelRequestOtherRoom 取消受邀请的回调 |
-
场景二,邀请方发起邀请后,被邀请方应答同意。
提示此场景中被邀请方应答同意,只有被邀请方不会收到应答的回调,包含邀请人在内两个房间的所有非观众用户都会收到代理回调。
邀请方 | 被邀请方 |
---|---|
步骤1:调用 RCRTCLocalUser 类中的 requestJoinOtherRoom 方法发起跨房间连麦邀请 | 步骤2:在 IRCRTCRoomEventsListener 中收到 onRequestJoinOtherRoom 邀请回调 |
步骤4:包含邀请人在内两个房间的所有非观众用户,不包含被邀请方,会在 IRCRTCRoomEventsListener 中收到 onResponseJoinOtherRoom 应答回调 | 步骤3:调用 RCRTCLocalUser 类中的 responseJoinOtherRoom 应答邀请,其中,agree 参数的值为 true |
-
场景三,邀请方发起邀请后,被邀请方应答拒绝。
提示此场景中被邀请方应答拒绝,只有邀请方会收到应答拒绝的回调,其他所有用户都不会收到代理回调。