同一个用户可以同时加入多个房间,并同时在多个房间内推流、拉流、发送实时消息和接收消息回调。
本功能可以隔离多个房间的消息及回调,实现更灵活的连麦业务。ZEGO 推荐用于跨房间连麦和在线教育的超级小班场景。
主播 A 与主播 B 进行跨房间连麦,主播 A 可以通知房间 A 中所有观众登录主播 B 的房间进行拉流,主播 B 同样可以通知房间 B 中所有观众登录主播 A 的房间进行拉流。
老师进入大班房间推流,学生都登录大班房间拉流,同时登录小组房间与同组学生讨论和连麦。助教老师登录小组房间维持课堂秩序或解答学生问题。
在实现多房间功能之前,请确保:
以同一用户加入两个房间为例,整体实现流程如下:
具体功能的实现如下:
请参考 快速开始 - 实现流程 的 “创建引擎” 进行 SDK 的初始化。
必须在初始化 SDK 之后,登录房间前调用,调用 enableMultiRoom 设置为true开启多房间
// 初始化 SDK
const zg = new ZegoExpressEngine(appID, server);
// 设置房间模式为多房间模式
zg.enableMultiRoom(true);
// 登录房间
zg.loginRoom()
如果在没有开通多房间功能的情况下设置多房间模式,登录房间会失败报错,返回错误码为“1100001016”。
通过 loginRoom 接口成功登录第一个房间后,再次调用 loginRoom 接口登录第二个房间。
// 先登录第一个房间
zg.loginRoom('first', token, {userID: 'zegoUser'});
// 后登录第二个房间
zg.loginRoom('second', token, {userID: 'zegoUser'});
登录第一个房间后,也可以通过 switchRoom 接口切换到另一个房间。
// 先登录第一个房间
zg.loginRoom('first', token, {userID: 'zegoUser'});
// 后登录第二个房间
zg.switchRoom('first', 'second', {token: token});
传入房间 ID 等参数,调用 startPublishingStream 接口在指定房间内推流。
const localStream = zg.createZegoStream();
zg.startPublishingStream(userID, localStream, { roomID: roomID });
拉流端根据流 ID 即可拉取到对应的流,多房间模式与普通单房间模式的拉流方式没有差别。
传入的流 ID,调用 startPlayingStream 接口即可进行拉流。
const remoteStream = await zg.startPlayingStream(streamID);
// remoteVideo 为本地<video>或<audio>对象
remoteVideo.srcObject = remoteStream;
调用 sendBroadcastMessage 接口发送广播消息,房间其他用户通过 IMRecvBroadcastMessage 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 房间其他人收到消息,通过房间 ID 来区分是哪个房间发送的
zg.on(
'IMRecvBroadcastMessage',
(
roomID: string,
chatData: Array<{
fromUser: ZegoUser;
message: string;
sendTime: number;
messageID: number;
}>,
) => {
console.log('IMRecvBroadcastMessage', roomID, chatData);
},
);
// 发送房间消息
zg.sendBroadcastMessage(
roomID,
JSON.stringify({
text: 'rtc.sendBroadcastMessage test',
}),
);
});
弹幕消息,主要用于大并发的场景,发送一些非必须到达的消息。
调用 sendBarrageMessage 接口发送弹幕消息,房间其他用户通过 IMRecvBarrageMessage 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 房间其他人收到消息,通过房间 ID 来区分是哪个房间发送的
zg.on(
'IMRecvBarrageMessage',
(
roomID: string,
chatData: Array<{
fromUser: ZegoUser;
message: string;
sendTime: number;
messageID: string;
}>,
) => {
console.log('IMRecvBarrageMessage', roomID, chatData);
},
);
// 发送
zg.sendBarrageMessage(
roomID,
JSON.stringify({
text: 'rtc.sendBarrageMessage test',
}),
);
自定义信令,指定房间里的用户(可以指定多个),发送特定的消息。
调用 sendCustomCommand 接口发送自定义信令,房间其他用户通过 IMRecvCustomCommand 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送
zg.sendCustomCommand(
roomID,
// JSON.stringify(
// @ts-ignore
{
text: 'rtc.sendCustomCommand test',
},
// )
[],
);
// 接收自定义信令
zg.on('IMRecvCustomCommand', (roomID: string, fromUser: ZegoUser, command: string) => {
console.log('IMRecvCustomCommand', roomID, fromUser, command);
});
调用 setRoomExtraInfo 接口发送房间附加信息,房间其他用户通过 roomExtraInfoUpdate 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送,一个房间内只允许 1 个 key
zg.setRoomExtraInfo(
roomID,
'2',
JSON.stringify({
text: 'rtc.setRoomExtraInfo test',
}),
);
// 接收,通过 setRoomExtraInfoCallback
zg.on('roomExtraInfoUpdate', (roomID: string, data: any) =>{
console.log('roomExtraInfoUpdate', roomID, data);
});
发送实时消息的大小和频率限制可参考 限制说明。
传入房间 ID ,调用 logoutRoom 接口退出房间。
zg.logoutRoom("roomid");
在没有开通多房间功能的情况下设置了多房间模式,登录房间会失败,返回错误码 1100001016。
同时登录的房间数超过最大房间个数后会返回错误码 1000005022。目前默认最多同时加入 5 个房间,如有更多需求,请联系 ZEGO 技术支持提供扩展能力。
联系我们
文档反馈