加入多房间

更新时间: 2024/03/15 17:26:14

在娱乐社交、在线教育等场景中,App 用户往往需要同时加入多个房间,接收多个房间的音视频流。网易云信 NERTC SDK 提供多房间管理功能,隔离多个房间的消息和回调,实现更灵活的房间管理业务。

多房间管理功能通常应用于以下场景:

  • 跨房间连麦与 PK:主播 A 房间中的用户和主播 B 可以同时加入彼此的房间进行连麦,与主播们另外加入一个公共房间的方案相比,同时加入多房间方案可以避免房间切换的复杂操作,直播体验更加友好。
  • 超级小班课:教师端加入大班房间,通过 RTC 或旁路推流实现课程直播,大班房间中的学生们各自加入小班房间,教师端也同时登录小班房间与学生端进行实时音视频互动,回答学生提问或组织讨论。根据场景需要,也可以配备一名助教老师登录小组房间,协助维持课堂秩序或解答学生问题。

注意事项

  • 您可以在直播场景或通信场景中使用多房间功能,且房间数量无限制。
  • 在离开第一个加入的房间之前,必须先离开其他房间,否则调用相关方法离开第一个房间时,会同时退出所有房间。
  • NERTC SDK 仅支持用户同一时间在一个房间内发布媒体流;例如,若用户已在房间 1 内发流,则在房间 2 内调用发流相关方法时,这些方法会调用失败并返回 30005 错误码。

实现方法

API 调用时序

多房间管理功能通过 IRtcChannel 类实现多房间控制,API 调用时序如下图所示。

uml diagram

配置步骤

  1. 初始化引擎。

    调用 Initialize 方法,创建并初始化引擎。

  2. 创建并加入房间 1 和房间 2。

    1. 调用 IRtcEngine 接口类的 CreateChannel 方法,通过 channelName 创建一个 IRtcChannel 对象。
    2. 调用 IRtcChannel 类声明的事件接收房间内的回调通知。
    3. 调用 IRtcChannel 类的 JoinChannel 方法加入房间。

    用户加入房间后,默认发布本地音频流并自动订阅房间内所有其他用户的音频流。您可以在加入房间后通过 IRtcChannel 类的相关方法修改音视频流的发布和订阅状态。

  3. 创建并加入其他房间。

    若您需要加入更多的房间,重复上述步骤 2 即可。

    • 加入多个房间时,请确保每个房间的房间名各不相同。
    • 同一时间,本地的音视频流只能发布到一个房间;若您需要调整发流的状态,请在发流的房间中停止发布音频流或视频流,然后在需要发流的房间中,开始发布音频流或视频流即可。
  4. 离开房间。

    调用 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}");
}
此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 实现方法
  • API 调用时序
  • 配置步骤
  • 示例代码