跨房间连麦
跨房间连麦中需要区分主房间和副房间概念。主副房间是相对概念,定义如下:
- 主房间:本端在最开始加入的房间。
- 副房间:在连麦邀请被接受后,双方均需要加入对方房间。
跨房间连麦前需要双方都已经加入自己的主房间,未加入主房间前无法进行连麦的邀请和被邀请。
处理连麦邀请
在建立连麦前,需要由一位主播发出邀请,另一位主播作出同意或拒绝连麦的应答。
发起邀请
向指定用户发送跨房间连麦请求,调用 RCRTCEngine
对象的 requestJoinSubRoom
方法。请求发送成功后,被邀请人会通过 setOnJoinSubRoomRequestReceivedListener
回调收到通知。
方法
rtcEngine.requestJoinSubRoom(roomId, userId, autoLayout, extra);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 对方的房间 ID |
userId | String | 是 | 对方用户 ID |
autoLayout | Boolean | 否 | 是否采用悬浮布局,默认 true |
extra | String | 否 | 附加信息 |
回调参数
参数 | 类型 | 说明 |
---|---|---|
roomId | String | 对方的房间 ID |
userId | String | 对方用户 ID |
code | Number | 错误码,0 表示成功 |
message | String | 错误信息 |
示例代码
// 设置邀请结果监听
rtcEngine.setOnJoinSubRoomRequestedListener((roomId, userId, code, message) => {
if (code == 0) {
// 邀请其他用户跨房间连麦成功, 等待对方处理
console.log('跨房间连麦邀请发送成功');
} else {
// 邀请其他用户跨房间连麦失败
console.log('跨房间连麦邀请发送失败:', message);
}
});
// 邀请其他用户跨房间连麦
rtcEngine.requestJoinSubRoom(roomId, userId, true, '');
console.log('发送跨房间连麦邀请');
应答邀请
被邀请人端收到邀请后,SDK 会触发 RCRTCEngine
对象的 setOnJoinSubRoomRequestResponseReceivedListener
回调方法。接收到邀请通知后,需要进行应答,可以同意连麦或拒绝连麦。
- 如果同意连麦,需调用
responseJoinSubRoomRequest
方法并将agree
参数设置为true
,发送同意连麦的应答。后续需要调用joinSubRoom
加入副房间。 - 如果拒绝连麦,需调用
responseJoinSubRoomRequest
方法并将agree
参数设置为false
。
方法
rtcEngine.responseJoinSubRoomRequest(roomId, userId, agree, autoLayout, extra);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 对方的房间 ID |
userId | String | 是 | 对方用户 ID |
agree | Boolean | 是 | 是否同意连麦 |
autoLayout | Boolean | 否 | 是否采用悬浮布局,默认 true |
extra | String | 否 | 附加信息 |
示例代码
// 收到其他用户发起的跨房间连麦邀请
rtcEngine.setOnJoinSubRoomRequestReceivedListener((roomId, userId, extra) => {
console.log('收到跨房间连麦邀请:', roomId, userId);
// 同意其他用户的跨房间连麦邀请
rtcEngine.responseJoinSubRoomRequest(roomId, userId, true, true, '');
console.log('同意跨房间连麦邀请');
});
// 设置应答结果监听
rtcEngine.setOnJoinSubRoomRequestResponseReceivedListener((roomId, userId, agree, extra) => {
if (agree) {
console.log('对方同意跨房间连麦邀请');
} else {
console.log('对方拒绝跨房间连麦邀请');
}
});
取消邀请
您的 App 用户可能在发起连麦邀请后改变主意,想要取消邀请,此时可调用 RCRTCEngine
对象的 cancelJoinSubRoomRequest
方法来取消正在进行中的跨房间连麦邀请。取消邀请时,被邀请人会收到 setOnCancelJoinSubRoomRequestReceivedListener
回调。
方法
rtcEngine.cancelJoinSubRoomRequest(roomId, userId, extra);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 对方的房间 ID |
userId | String | 是 | 对方用户 ID |
extra | String | 否 | 附加信息 |
回调参数
参数 | 类型 | 说明 |
---|---|---|
roomId | String | 对方的房间 ID |
userId | String | 对方用户 ID |
code | Number | 错误码,0 表示成功 |
message | String | 错误信息 |
示例代码
// 取消之间发起的跨房间连麦邀请的回调
rtcEngine.setOnJoinSubRoomRequestCanceledListener((roomId, userId, code, message) => {
if (code == 0) {
// 取消成功
console.log('跨房间连麦邀请取消成功');
} else {
// 取消失败
console.log('跨房间连麦邀请取消失败:', message);
}
});
// 取消之间发起的跨房间连麦邀请
rtcEngine.cancelJoinSubRoomRequest(roomId, userId, '');
console.log('取消跨房间连麦邀请');
加入副房间流程
在连麦邀请被接受后,双方均需要加入对方房间。相对在本端已加入直播房间主播用户来说,对方房间为副房间。加入副房间方法如下:
方法
rtcEngine.joinSubRoom(roomId);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 副房间 ID |
回调参数
参数 | 类型 | 说明 |
---|---|---|
roomId | String | 副房间 ID |
code | Number | 错误码,0 表示成功 |
message | String | 错误信息 |
示例代码
// 加入副房间结果的回调
rtcEngine.setOnSubRoomJoinedListener((roomId, code, message) => {
if (code == 0) {
// 加入副房间成功
console.log('加入副房间成功:', roomId);
} else {
// 加入副房间失败
console.log('加入副房间失败:', message);
}
});
// 加入副房间
rtcEngine.joinSubRoom(roomId);
console.log('请求加入副房间');
邀请方与受邀方加入副房间的时机如下:
- 受邀方:在作出同意连麦的应答成功后,调用
RCRTCEngine
对象的joinSubRoom
方法加入副房间。 - 邀请方:在收到同意连麦的应达后(
setOnJoinSubRoomRequestResponseReceivedListener
),调用RCRTCEngine
对象的joinSubRoom
方法加入副房间。此时会触发setOnSubRoomJoinedListener
、setOnSubRoomBandedListener
、setOnUserJoinedListener
回调。
在超过两位主播连麦时,可能还会有以下两种场景:
-
场景 A:在当前用户加入主房间前,该主房间已有主播用户与其他房间另一用户成功建立跨房间连麦。当前用户可在加入主房间时收到
onSubRoomBanded
回调,用户可在此回调中选择是否加入其他副房间。详细流程如下:-
调用
RCRTCEngine
中joinRoom
方法加入主房间。 -
setOnSubRoomBandedListener
事件回调方法被触发。JavaScript/**
* 主房间中主播已经加入的副房间的回调
*/
rtcEngine.setOnSubRoomBandedListener((roomId) => {
console.log('主房间中已有副房间:', roomId);
}); -
调用
RCRTCEngine
对象的joinSubRoom
方法加入副房间。
-
-
场景 B:在当前用户加入主房间后,主房间内的另一主播用户发起了跨房间连麦并加入了其他房间,此时当前用户会收到
setOnSubRoomBandedListener
回调,用户可在此回调中选择是否加入其他副房间。
订阅资源
在加入副房间成功后,需要订阅副房间主播的资源。有两种方式:
-
加入副房间后,通过
RCRTCEngine
对象的subscribe
方法订阅副房间中远端用户已经发布的音视频资源。参考 订阅资源。JavaScriptrtcEngine.setOnSubscribedListener((userId, type, code, message) => {
if (code == 0) {
// 订阅成功
console.log('订阅副房间资源成功');
} else {
// 订阅失败
console.log('订阅副房间资源失败:', message);
}
});
// 订阅远端用户的资源
rtcEngine.subscribe(userId, RCRTCMediaType.Video);
console.log('订阅副房间视频资源'); -
副房间主播发布资源时,
setOnRemotePublishedListener
方法会被触发,可通过roomId
判断是否为副房间。在该回调中调用subscribe
方法订阅副房间中远端用户刚发布的音视频资源。JavaScript// 远端用户发布资源的回调
rtcEngine.setOnRemotePublishedListener((roomId, userId, type) => {
// 订阅远端用户发布的资源
rtcEngine.subscribe(userId, type);
console.log('订阅副房间新发布的资源');
});
如需取消订阅资源,可调用 unsubscribe
方法取消订阅的资源,可参考 取消订阅资源。
暂时中止连麦
当需要暂时中止连麦时,可离开副房间。调用 RCRTCEngine
对象的 leaveSubRoom
方法暂时离开副房间。
方法
rtcEngine.leaveSubRoom(roomId, disband);
参数说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 副房间 ID |
disband | Boolean | 是 | 是否要结束连麦,暂时中止连麦时设置为 false |