跨房间连麦
跨房间连麦需要区分“主房间”和“副房间”的概念,主副房间是相对概念,定义如下:
- 主房间:本端最先加入的房间,即 RCRTCRoom。
- 副房间:在连麦邀请被接受后,双方加入对方房间,对方房间即:RCRTCOtherRoom。
开始跨房间连麦前,双方都需要先加入各自的主房间;未加入主房间前,无法发起或接收跨房间连麦邀请。
两种房间类型对应不同的事件回调:主房间使用 IRCRTCRoomEventsListener,副房间使用 IRCRTCOtherRoomEventsListener。
主流程
发起邀请
向指定用户发送跨房间连麦请求:在加入房间成功的回调中,通过 RCRTCRoom
获取 RCRTCLocalUser
对象,调用 requestJoinOtherRoom 方法。
示例代码:
Java
/**
* 向指定用户发送跨房间连麦请求
* 1. 当 inviterAutoMix 为 true 时:
*
* 1.1 如果被邀请方在加入邀请方房间之前发布了资源,当被邀请方加入邀请方房间成功后,服务器会将被邀请方的流资源合并到邀请方视图(默认仅悬浮布局合流)上。
*
* 1.2 如果被邀请方在加入邀请方房间之前未发布资源,将在被邀请方发布资源成功后,服务器再把被邀请方的流资源合并到邀请方视图(默认仅悬浮布局合流)上。
*
* 2. 无论 inviterAutoMix 为 true 还是 false,双方都可以使用 {@link RCRTCLiveInfo#setMixConfig(RCRTCMixConfig, IRCRTCResultCallback)} 主动设置合流布局。
* 一旦主动设置过合流布局,后续音视频直播过程中设置的自动合流参数将失效。
*/
RCRTCRoom.getLocalUser().requestJoinOtherRoom(inviteeRoomId, inviteeUserId, inviterAutoMix, "extra", new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
取消邀请
收到其他房间主播的跨房间连麦邀请后,如果不打算加入,调用 RCRTCLocalUser
的 cancelRequestJoinOtherRoom 取消进行中的邀请。
示例代码
Java
RCRTCRoom.getLocalUser().cancelRequestJoinOtherRoom(inviteeRoomId, inviteeUserId, "extra", new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
应答邀请
收到跨房间连麦邀请后,如果同意加入,需要先调用 RCRTCLocalUser
的 responseJoinOtherRoom 应答,再调用 joinOtherRoom
加入副房间。
示例代码
Java
/**
* <p>
* 1. 当 inviteeAutoMix 为 true 时:
*
* 1.1 如果邀请方在发送连麦请求之前发布了资源,当被邀请方加入邀请方房间成功后,服务器会把邀请方的流资源合并到被邀请方视图(默认仅悬浮布局合流)上。
*
* 1.2 如果邀请方在发送连麦请求之前未发布资源,将在邀请方发布资源成功后,服务器才会把邀请方的资源合并到被邀请方视图(默认仅悬浮布局合流)上。
*
* 2. 无论 inviteeAutoMix 为 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) {
}
});
加入副房间
可调用 joinOtherRoom 方法,加入副房间。
示例代码
Java
RCRTCEngine.getInstance().joinOtherRoom(roomId, new IRCRTCResultDataCallback<RCRTCOtherRoom>() {
@Override
public void onSuccess(RCRTCOtherRoom rcrtcOtherRoom) {
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
}
});
注册其他房间事件监听
- 在加入副房间成功后的回调中,获取
RCRTCOtherRoom
对象,调用registerOtherRoomEventsListener
注册副房间事件监听。当副房间主播加入、离开、发布资源时会触发回调;在回调中按需订阅音视频资源。可进行音视频通话。 - 在不使用或退出房间前,调用
RCRTCOtherRoom.unregisterOtherRoomEventsListener
取消注册。
Java
RCRTCOtherRoom.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 离开副房间。
示例代码:
Java
RCRTCEngine.getInstance().leaveOtherRoom(roomId, notifyFinished, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
}
});
邀请连麦流程
-
场景一:邀请方发起邀请后又取消邀请。
提示此场景中,被邀请方未做任何操作,仅被动收到两次代理回调。
邀请方