同一个用户可以同时加入多个房间,并同时在多个房间内推流、拉流、发送实时消息和接收消息回调。
本功能可以隔离多个房间的消息及回调,实现更灵活的连麦业务。ZEGO 推荐用于跨房间连麦和在线教育的超级小班场景。
主播 A 与主播 B 进行跨房间连麦,主播 A 可以通知房间 A 中所有观众登录主播 B 的房间进行拉流,主播 B 同样可以通知房间 B 中所有观众登录主播 A 的房间进行拉流。
老师进入大班房间推流,学生都登录大班房间拉流,同时登录小组房间与同组学生讨论和连麦。助教老师登录小组房间维持课堂秩序或解答学生问题。
在实现多房间功能之前,请确保:
以同一用户加入两个房间为例,整体实现流程如下:
具体功能的实现如下:
必须在初始化 SDK 之前,将房间模式 ZegoRoomMode 设置为多房间模式 “MultiRoom”。
// 设置房间模式为多房间模式
ZegoLiveRoom.setRoomMode(ZegoConstants.ZegoRoomMode.MultiRoom);
如果在没有开通多房间功能的情况下设置多房间模式,登录房间会失败报错,返回错误码为“62001016”。
调用 setRoomMode 接口设置允许观众创建房间以及用户状态更新回调,在房间创建之前设置有效,多房间模式下必须带上房间 ID。
boolean audienceCreateRoom = true;
boolean userStateUpdate = false;
api.setRoomConfig(audienceCreateRoom, userStateUpdate, "roomid");
调用 setRoomMaxUserCount 接口设置房间最大在线人数,在房间创建之前设置有效,多房间模式下必须传入房间 ID。
api.setRoomMaxUserCount(100, "roomid");
调用 setToken 接口设置房间的鉴权 Token,Token 的生成规则请参考 用户权限控制。
在 Token 快要过期的前 30s,会收到 onTokenWillExpired 回调通知。重新生成 Token 后再调用 setToken 接口设置。
String token = "create token";
api.setToken(token, "roomid");
在登录房间前,注册房间相关的接口。
// 创建 ZegoLiveRoom 的单例对象
ZegoLiveRoom api = new ZegoLiveRoom();
...
// 当前对象实现 IZegoRoomCallback 类
api.setZegoRoomCallback(this);
房间相关的所有回调接口都会带上房间 ID 参数,用于区分是哪个房间的回调。相关回调如下:
// 参数 roomID 表示房间 ID
void onKickOut(int reason, String roomID, String customReason);
// 参数 roomID 表示房间 ID
void onDisconnect(int errorCode, String roomID);
// 参数 roomID 表示房间 ID
void onTempBroken(int errorCode, String roomID);
// 参数 roomID 表示房间 ID
void onReconnect(int errorCode, String roomID);
传入房间 ID 等参数,调用 loginRoom 接口登录房间。
api.loginRoom("roomid", "room_title", 1, new IZegoLoginCompletionCallback(){
@Override
void onLoginCompletion(int errorCode, ZegoStreamInfo[] listStream){}
});
传入房间 ID 等参数,调用 startPublishingWithParams 接口在指定房间内推流。
ZegoPublishStreamParams params;
params.streamID = "streamid";
params.streamTitle = "title";
params.extraInfo = "";
params.publishFlag = ZegoConstants.PublishFlag.JoinPublish;
params.publishParams = "";
params.channelIndex = ZegoConstants.PublishChannelIndex.MAIN;
params.roomID = "roomid";
api.startPublishingWithParams(params);
多房间模式下,不支持 startPublishing 和 startPublishing2 接口,请使用 startPublishingWithParams,必须指定关联的房间 ID。
传入房间 ID 等参数,调用 startPlayingStreamWithParams 接口在指定房间内拉流。
ZegoPlayStreamParams params;
params.streamID = "streamid";
params.displayView = view; // display view
params.extraInfo = null; // extra info
params.roomID = "roomid";
api.startPlayingStreamWithParams(params);
多房间模式下,不支持 startPlayingStream 接口,请使用 startPlayingStreamWithParams,必须指定关联的房间 ID。
调用 sendRoomMessage 接口发送广播消息,房间其他用户通过 onRecvRoomMessage 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送房间消息
api.sendRoomMessage(MessageType.Text, MessageCategory.Chat, "message", "roomid", new IZegoRoomMessageCallback(){
@Override
void onSendRoomMessage(int errorCode, String roomID, long messageID){}
});
// 房间其他人收到消息,通过房间 ID 来区分是哪个房间发送的
// IZegoIMCallback
void onRecvRoomMessage(String roomID, ZegoRoomMessage[] listMsg);
弹幕消息,主要用于大并发的场景,发送一些非必须到达的消息。
调用 sendBigRoomMessage 接口发送弹幕消息,房间其他用户通过 onRecvBigRoomMessage 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送
api.sendBigRoomMessage(MessageType.Text, MessageCategory.Chat, "message", "roomid", new IZegoBigRoomMessageCallback(){
@Override
void onSendBigRoomMessage(int errorCode, String roomID, String messageID){}
});
// 房间其他人收到消息,通过房间 ID 来区分是哪个房间发送的
// IZegoIMCallback
void onRecvBigRoomMessage(String roomID, ZegoBigRoomMessage[] listMsg);
自定义信令,指定房间里的用户(可以指定多个),发送特定的消息。
调用 sendCustomCommand 接口发送自定义信令,房间其他用户通过 onRecvCustomCommand 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送
ZegoUser[] listMember;
...
api.sendCustomCommand(listMember, "message", "roomid", new IZegoCustomCommandCallback(){
@Override
void onSendCustomCommand(int errorCode, String roomID){}
});
// 接收, IZegoRoomCallback
void onRecvCustomCommand(String userID, String userName, String content, String roomID);
调用 setRoomExtraInfo 接口发送房间附加信息,房间其他用户通过 onRoomExtraInfoUpdated 回调接收消息,可通过房间 ID 来区分是哪个房间发送的。
// 发送,一个房间内只允许 1 个 key
ZegoLiveRoomExtraInfo.getInstance().setRoomExtraInfo("key", "value", "roomid", new IZegoSetRoomExtraInfoCallback(){
@Override
void onSetRoomExtraInfo(int errorCode,String roomId, String key){}
}));
// 接收,通过 setRoomExtraInfoCallback(IZegoRoomExtraInfoCallback callback) 注册回调
void onRoomExtraInfoUpdated(String roomId, ZegoRoomExtraInfo[] extraInfoArray);
发送实时消息的大小和频率限制可参考 限制说明。
传入房间 ID ,调用 logoutRoom 接口退出房间。
api.logoutRoom("roomid");
方法 | 描述 |
---|---|
setRoomMode | 设置房间模式 |
loginRoom | 登录房间 |
logoutRoom | 退出房间 |
setZegoRoomCallback | 设置直播房间相关信息通知的回调 |
setRoomConfig | 设置房间配置信息 |
setToken | 设置房间的鉴权 token |
setRoomMaxUserCount | 设置房间最大在线人数 |
sendCustomCommand | 发送自定义信令 |
setZegoIMCallback | 设置 IM 信息通知的回调对象 |
sendRoomMessage | 发送房间消息 |
sendBigRoomMessage | 发送不可靠信道消息 |
startPlayingStreamWithParams | 播放多媒体流 |
startPublishingWithParams | 开始直播 |
setRoomExtraInfoCallback | 设置 RoomExtraInfo 通知的回调 |
setRoomExtraInfo | 更新房间属性 登录房间成功后使用 |
在没有开通多房间功能的情况下设置了多房间模式,登录房间会失败,返回错误码 62001016。
同时登录的房间数超过最大房间个数后会返回错误码 52005022。目前默认最多同时加入 5 个房间,如有更多需求,请联系 ZEGO 技术支持提供扩展能力。
联系我们
文档反馈