实时音视频

  • 实时音视频 > 使用指南 > Windows >房间管理

    房间管理

    最近更新时间:2021-11-19 11:24:55

    房间表示一个多人的视频会话,本部分介绍如何进行房间管理,获取房间信息以及用户信息,介绍如何使用踢人等常见功能。

    加入房间

    本地调用 QNRTCClient.Join(String token) 通过 roomToken 加入房间。

    virtual void Join(const std::string& token, const std::string& userData = "") = 0;
    

    示例代码如下:

    _rtc_client_ptr->Join(_room_token);
    
    1. 请确保在 QNConnectionState.DISCONNECTED 状态下调用该接口加入房间,否则接口调用无效
    2. 加入房间时根据业务需求,每个用户可通过 userData 携带自定义数据

    关于 roomToken 在服务端的生成可查阅 RoomToken 的签算

    本地加入房间成功后,会触发如下回调:

    本地用户收到的回调:

    当成功加入房间后,会通过 QNClientEventListener.OnConnectionStateChanged 接收到房间状态改变的通知

    class QNClientEventListener
    {
    public:
        // 当房间状态改变时会触发此回调,成功加入房间后,回调状态为 QNConnectionState.CONNECTED
        virtual void OnConnectionStateChanged(QNConnectionState state, const QNConnectionDisconnectedInfo& info) = 0;
    }
    

    远端用户收到的回调:

    class QNClientEventListener
    {
    public:
        // 当远端用户加入房间时会触发此回调
        virtual void OnUserJoined(const std::string& remoteUserID, const std::string& userData) = 0;
    }
    

    离开房间

    本地调用 QNRTCClient.Leave() 退出房间。本地退出房间成功后,会触发如下回调:

    本地用户收到的回调:

    class QNClientEventListener
    {
    public:
        // 当房间状态改变时会触发此回调,成功离开房间后,回调状态为 QNConnectionState.DISCONNECTED,QNConnectionDisconnectedInfo 回调 Reason 为 LEAVE
        void OnConnectionStateChanged(QNConnectionState state, const QNConnectionDisconnectedInfo& info) = 0;
    }
    

    远端用户收到的回调:

    class QNClientEventListener
    {
    public:
        // 当远端用户离开房间时会触发此回调
        virtual void OnUserLeft(const std::string& remoteUserID) = 0;
    }
    

    房间信息

    获取房间内远端用户信息

    本地可调用 QNRTCClient.GetRemoteUsers(const std::string& userId) 接口获取音视频通话房间中的指定用户。

    virtual QNRemoteUser& GetRemoteUsers(const std::string& userId) = 0;
    

    本地可调用 QNRTCClient.GetRemoteUsers() 接口获取音视频通话房间中的远端用户列表。

    virtual RemoteUserList& GetRemoteUsers() = 0;
    

    其中,QNRemoteUser 代表远端用户的信息,通过该对象可以获取指定 user 发布的音视频列表以及本地对其的订阅情况。


    踢人

    客户端踢人

    客户端 SDK 未提供踢人的接口,但是踢人操作可以通过自定义消息来实现。实现步骤可参考如下:

    1. 业务侧协商定义好踢人消息的格式规范
    2. 踢人方在执行踢人操作时,向指定用户发送协商好的踢人消息
    3. 被踢方接收到踢人消息后,主动离开当前房间

    示例代码参考如下:

    踢人方:

    踢人方发送协商好的踢人消息:

    rtc_client_ptr->SendCustomMessage({"userID"}, "messageID", "kickOut");
    

    其中,自定义消息的使用方式可以参考 QNRTCClient.SendCustomMessage

    被踢方:

    被踢方监听 QNClientEventListener.OnMessageReceived 回调接口来接收踢人消息,并在收到消息后主动离开房间:

    void CRtcDemoV2::OnMessageReceived(const qiniu::CustomMessageList& message)
    {
        for (auto&& itor : message) {
            if (itor.msg_text.compare("kickout") == 0) {
                PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON_LOGIN, BN_CLICKED), NULL);
                wchar_t buff[1024] = { 0 };
                _snwprintf(
                    buff,
                    1024,
                    _T("被 %s 用户踢出!"),
                    utf2unicode(itor.msg_sendid).c_str()
                );
                _wnd_status_bar.SetText(buff, 1, 0);
                return;
            }
            _dlg_msg.OnReceiveMessage(itor.msg_sendid, utf8_to_string(itor.msg_text));
        }
    }
    

    服务端踢人

    服务端提供了踢人的接口,详情可参考服务端文档,当服务端执行踢人操作后,会触发被踢方 QNClientEventListener.OnConnectionStateChanged 回调:

    void CRtcDemoV2::OnConnectionStateChanged(qiniu::QNConnectionState state, const qiniu::QNConnectionDisconnectedInfo& info)
    {
        if (state == DISCONNECTED) {
            if (info.reason == QNConnectionDisconnectedInfo::KICKED_OUT) {
                _wnd_status_bar.SetText(_T("被服务器踢出房间!"), 1, 0);
            }
        }
    }
    

    其中,被服务端踢出房间的场景下 QNConnectionDisconnectedInfo 回调的状态为 QNConnectionState.DISCONNECTED,同时 QNConnectionDisconnectedInfo.ReasonKICKED_OUT

    以上内容是否对您有帮助?
  • Qvm free helper
    Close