加入多房间
更新时间: 2024/09/18 16:26:13
在娱乐社交、在线教育等场景中,App 用户往往需要同时加入多个房间,接收多个房间的音视频流。网易云信 NERTC SDK 提供多房间管理功能,隔离多个房间的消息和回调,实现更灵活的房间管理业务。
多房间管理功能通常应用于以下场景:
- 跨房间连麦与 PK:主播 A 房间中的用户和主播 B 可以同时加入彼此的房间进行连麦,与主播们另外加入一个公共房间的方案相比,同时加入多房间方案可以避免房间切换的复杂操作,直播体验更加友好。
- 超级小班课:教师端加入大班房间,通过 RTC 或旁路推流实现课程直播,大班房间中的学生们各自加入小班房间,教师端也同时登录小班房间与学生端进行实时音视频互动,回答学生提问或组织讨论。根据场景需要,也可以配备一名助教老师登录小组房间,协助维持课堂秩序或解答学生问题。
注意事项
- 您可以在直播场景或通信场景中使用多房间功能,且房间数量无限制。
- 在离开第一个加入的房间之前,必须先离开其他房间,否则调用相关方法离开第一个房间时,会同时退出所有房间。
- NERTC SDK 仅支持用户同一时间在一个房间内发布媒体流;例如,若用户已在房间 1 内发流,则在房间 2 内调用发流相关方法时,这些方法会调用失败并返回 30005 错误码。
实现方法
API 调用时序
多房间管理功能通过 IRtcChannel
类实现多房间控制,API 调用时序如下图所示。
配置步骤
-
初始化引擎。
调用
Initialize
方法,创建并初始化引擎。 -
创建并加入房间 1 和房间 2。
- 调用
IRtcEngine
接口类的CreateChannel
方法,通过channelName
创建一个IRtcChannel
对象。 - 调用
IRtcChannel
类声明的事件接收房间内的回调通知。 - 调用
IRtcChannel
类的JoinChannel
方法加入房间。
用户加入房间后,默认发布本地音频流并自动订阅房间内所有其他用户的音频流。您可以在加入房间后通过
IRtcChannel
类的相关方法修改音视频流的发布和订阅状态。 - 调用
-
创建并加入其他房间。
若您需要加入更多的房间,重复上述步骤 2 即可。
- 加入多个房间时,请确保每个房间的房间名各不相同。
- 同一时间,本地的音视频流只能发布到一个房间;若您需要调整发流的状态,请在发流的房间中停止发布音频流或视频流,然后在需要发流的房间中,开始发布音频流或视频流即可。
-
离开房间。
调用
IRtcChannel
类的LeaveChannel
方法离开房间,各个房间各自独立,互不影响。离开第一个房间之前,必须先离开其他房间,否则调用相关方法离开第一个房间时,会同时退出所有房间。
例如本地用户加入了房间 1、房间 2、房间 3,必须先退出房间 2 和房间 3,之后才能退出房间 1。房间 2 和房间 3 之间的退出顺序无限制。
示例代码
cpp
IRtcEngine _rtcEngine = IRtcEngine.GetInstance();
IRtcChannel _channel1 = null;
IRtcChannel _channel2 = null;
private bool InitRtcEngine()
{
//Initialize RtcEngine
var context = new RtcEngineContext();
context.appKey = "YOUR APPKEY";
context.logPath = Application.persistentDataPath;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");
context.context = activity;
#endif
int result = _rtcEngine.Initialize(context);
if (result != (int)RtcErrorCode.kNERtcNoError)
{
Debug.LogWarning($"RtcEngine Initialize Failed : {result}");
return false;
}
Debug.Log($"RtcEngine Initialize Success");
//create channel object
_channel1 = _rtcEngine.CreateChannel(CHANNEL_NAME_1);
_channel2 = _rtcEngine.CreateChannel(CHANNEL_NAME_2);
//only one channel can publish audio or video stream
_channel1.EnableLocalAudio(true);
_channel1.EnableLocalVideo(true);
_channel2.EnableLocalAudio(false);
_channel2.EnableLocalVideo(false);
//bind channel callbacks
BindChannelEvent(_channel1);
BindChannelEvent(_channel2);
return true;
}
private void BindChannelEvent(IRtcChannel channel)
{
channel.ChannelOnJoinChannel = ChannelOnJoinChannelHandler;
channel.ChannelOnLeaveChannel = ChannelOnLeaveChannelHandler;
}
private void ChannelOnJoinChannelHandler(IRtcChannel channel,ulong cid, ulong uid, RtcErrorCode result, ulong elapsed)
{
Debug.Log($"ChannelOnJoinChannel channel - {channel.GetChannelName()},cid - {cid}, uid- {uid},result - {result}, elapsed - {elapsed}");
}
private void ChannelOnLeaveChannelHandler(IRtcChannel channel, RtcErrorCode result)
{
Debug.Log($"ChannelOnLeaveChannel channel - {channel.GetChannelName()}, result - {result}");
}
此文档是否对你有帮助?