实时音视频

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

    房间管理

    最近更新时间: 2024-11-01 11:32:39

    房间是对音视频对话空间的抽象,用于隔离不同的通话过程,保障数据的安全及独立。同一房间内的用户可以互相接收对方的音视频数据。本部分介绍如何进行房间管理,获取房间信息、用户信息以及如何实现踢人等常见功能。

    • 加入、离开房间代表一次音视频通话的开始和结束,一次会话仅需调用一次加入、离开的操作即可,无需重复调用。加入房间后对音视频数据的发送和接收,可参考发布和订阅相关流程。
    • 加入房间需要携带相应的 RoomTokenRoomToken 需通过您的服务端生成,签算方式可参考 RoomToken 签发服务

    房间的生命周期

    • 当用户加入的房间不存在时,七牛后台服务会自动创建对应的房间。
    • 若房间内的所有用户都已离开,那么房间维持空状态 10s 后将会自动关闭。
    • 若房间为服务端创建,且创建后无用户进入,那么房间维持空状态 30s 后将会自动关闭。
    • 若房间内的用户由于断网等原因,30s 未向七牛后台服务通信,则该用户将被视为退出房间。

    加入房间

    本地通过 QNRTCClient 传入 RoomToken 加入房间。

      /**
       * 加入房间
       * 接口调用成功后,将会触发 {@link QNClientEventListener#OnConnectionStateChanged} 回调
       *
       * @param token 房间 token
       * @returns 操作是否成功,成功为 QNErrorCode.OK,失败则为相应错误码
       */
      Join(token: string): number
    

    示例代码如下:

    this.client.Join(token)
    

    请确保在 QNConnectionState.Disconnected 状态下调用该接口加入房间,否则接口调用无效

    关于 RoomToken 在服务端的生成,可查阅 RoomToken 签发服务

    本地用户收到的回调:

    成功加入房间后,会通过 QNClientEventListener.OnConnectionStateChanged 回调改变后的房间状态

    private clientListener: QNClientEventListener = {
      OnConnectionStateChanged: (state: QNConnectionState, info: QNConnectionDisconnectedInfo) => {
    	// 当房间状态改变时会触发此回调,成功加入房间后,回调状态为 Connected
      }
    }
    

    远端用户收到的回调:

    private clientListener: QNClientEventListener = {
      OnUserJoined: (remoteUserId: string, userData: string) => {
    	// 当远端用户加入房间时会触发此回调
      }
    }
    

    离开房间

    本地通过调用 QNRTCClient.Leave 退出房间。

      /**
       * 离开房间
       * 成功离开房间后,会触发 {@link QNClientEventListener#OnConnectionStateChanged} 回调,回调状态为 {@link QNConnectionState.DISCONNECTED}
       *
       * @returns 操作是否成功,成功为 QNErrorCode.OK,失败则为相应错误码
       */
      Leave(): number
    

    示例代码如下:

    let ret: number = this.client.Leave()
    

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

    本地用户收到的回调:

    private clientListener: QNClientEventListener = {
      OnConnectionStateChanged: (state: QNConnectionState, info: QNConnectionDisconnectedInfo) => {
    	// 当房间状态改变时会触发此回调,成功离开房间后,回调状态为 Disconnected,info 回调 Reason 为 Leave
      }
    }
    

    远端用户收到的回调:

    private clientListener: QNClientEventListener = {
      OnUserLeft: (remoteUserId: string) => {
    	// 当远端用户离开房间时会触发此回调
      }
    }
    

    房间信息

    获取房间内远端用户信息

    本地可调用 QNRTCClient.GetRemoteUsersByUserId 接口获取音视频通话房间中的指定用户。

      /**
       * 获取对应 ID 的远端用户
       *
       * @param userId 用户 ID
       * @returns 远端用户
       */
      GetRemoteUsersByUserId(userId: string): QNRemoteUser | null
    

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

      /**
       * 获取所有远端用户
       *
       * @returns 所有远端用户
       */
      GetRemoteUsers(): QNRemoteUser[]
    

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

    获取房间状态信息

    本地可以调用 QNRTCClient.GetConnectionState 接口获取音视频通话的房间状态信息。

      /**
       * 获取当前的房间连接状态
       *
       * @returns 当前的房间连接状态
       */
      GetConnectionState(): QNConnectionState
    

    其中,QNConnectionState 包含如下状态:

    /**
     * 连接状态
     */
    export enum QNConnectionState {
      /**
       * 未连接状态
       * 未连接, SDK 出现无法恢复错误时也进入该状态
       */
      Disconnected = 0,
      /**
       * 正在连接
       * 当调用 {@link QNRTCClient#Join} 后, 首先进入该状态;表示开始连接房间服务
       */
      Connecting = 1,
      /**
       * 连接成功
       * 当调用 {@link QNRTCClient#Join},在完成和房间服务连接后进入该状态
       */
      Connected = 2,
      /**
       * 正在重连
       * 当和房间的已有连接由于网络中断、网络异常等原因断开,SDK 进行周期性重连时进入该状态
       */
      Reconnecting = 3,
      /**
       * 重连成功
       * 当从 RECONNECTING 状态,重新和房间服务建立连接后进入该状态
       */
      Reconnected = 4
    }
    

    服务端踢人

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

    private clientListener: QNClientEventListener = {
      OnConnectionStateChanged: (state: QNConnectionState, info: QNConnectionDisconnectedInfo) => {
    	// info 回调 Reason 为 KickedOut
      }
    }
    

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

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