语聊房
  • iOS
  • Android : Java
  • 概述
  • 体验 App
  • 体验 App 源码运行指引
  • 实现流程
  • API 文档
  • 常见错误码
  • 文档中心
  • 语聊房
  • 实现流程

实现流程

更新时间:2023-03-09 11:15

概述

语聊房是指在线语音连麦虚拟房间。在本方案中,每个房间设有若干个麦位,主播在麦上聊天,同时向房间内其他用户推流,其他听众可以进入房间收听。主播也可邀请听众上麦互动,但是听众之间不能互相邀请上麦进行互动。

ZEGO 语聊房解决方案预设 5 个麦位(包括主播麦位),听众人数在客户端侧没有做限制(但会受限于 ZEGO Express SDK 和 ZIM SDK)。

方案架构

本方案房间内业务的整体架构如下图所示。由于业务后台仅管理房间列表,不涉及房间内业务,因此没有在下图中体现。房间内通过 ZIM SDK 进行消息的可靠传输,实现麦位管理,通过 ZEGO Express SDK 实现推拉流管理。

/Pics/GoEnjoy/chathouse/Android/chat_house_internal_buiness_architec.png

在实现本方案过程中,如果您无需使用 视频 相关服务(纯音频 场景),请及时调用 Express SDK 的 enableCamera 接口关闭摄像头(默认是开启的),以免产生视频使用时长,造成额外费用,给您带来不便。

体验 App 源码

ZEGO 针对语聊房场景提供了 体验 App 源码,以供开发者进一步了解 ZEGO 语聊房方案。

前提条件

麦位管理

在语聊房内进行麦位管理,能够确保用户根据自身 角色 有序展开活动。本解决方案是通过调用 ZIM SDK 接口 实现麦位管理,主要包括 发起连麦结束连麦 以及 麦位列表同步

角色介绍

语聊房内不同角色的行为如下表所示:

角色 行为
主播
负责语聊房房间的创建和销毁。主播在创建房间后自动上麦,且无法下麦。本方案的麦位更新逻辑对主播有强依赖,因此,只有主播在良好的网络环境下,玩家才能有相对良好的游戏体验。
麦下听众
所有用户(除主播)在刚进入房间均为此角色。麦下听众只能听麦上用户的语音聊天,不能参与,如需加入聊天需要上麦。
麦上听众
当麦下听众向主播申请上麦,或被主播邀请上麦且同意后,即成为麦上听众。
麦上用户
包括主播和麦上听众。麦上用户可互相进行语音聊天。

相关接口

ZIM SDK 提供了一组现成的 呼叫邀请 功能接口,包括:

  1. 发起呼叫邀请;
  2. 取消呼叫邀请;
  3. 接受呼叫邀请;
  4. 拒绝呼叫邀请;
  5. 超时未响应呼叫邀请。

以上接口的示例代码与使用须知,请参考 呼叫邀请。下文展示在语聊房中该组接口的使用情况。

发起连麦

发起连麦主要使用了 ZIM SDK 的呼叫邀请接口,存在两种使用情况,即一方发起连麦邀请,一方接受或拒绝,下文从听众视角展示相关接口调用顺序,但主播方也遵循同样时序:

  1. 听众向主播发起连麦申请,且主播接受申请,时序图如下:

    /Pics/GoEnjoy/GoChatHouse/iOS/gch_invitation_accept_Android.png

  2. 听众向主播发起连麦申请,但主播拒绝申请,时序图如下:

    /Pics/GoEnjoy/GoChatHouse/iOS/gch_invitation_reject_Android.png

结束连麦

麦上听众通过修改房间属性从而修改自己的麦位信息,其他用户在监听到房间属性变更后执行更新操作。基本时序图如下:

/Pics/GoEnjoy/GoChatHouse/iOS/gch_invitation_finish.png

不论是麦上听众主动下麦,还是主播将麦上听众踢下麦位,都是采用相同逻辑。

麦位列表同步

语聊房使用 ZIM SDK 提供的 房间属性功能 实现麦位数据的同步。房间属性是一个以 key-value 为存储方式的对象,最多能设置 10 个属性。每个麦位占用一个键值对,key 为麦位序号,value 为麦位数据。

房间属性由主播负责更新,听众只需接收房间属性更新通知,用于变更麦位信息。不过,麦上听众主动结束连麦的时候,由该用户负责更新房间属性。这是为了防止主播在断网情况下听众无法下麦。

/Pics/GoEnjoy/GoChatHouse/iOS/gch_seat_sync_Android.png

推拉流管理

为了实现成本与体验效果的平衡,本方案各角色的推拉流策略如下表所示:

角色 推拉流
主播
推一路 RTC 单流,拉取其他麦上听众的 RTC 单流
麦上听众
推一路 RTC 单流,拉取其他麦上听众和主播的 RTC 单流。
麦下听众
不推流,仅从 RTC 服务器拉取麦上听众和主播的 RTC 单流。

/Pics/GoEnjoy/MetaChat/metachat_stream_management.png

本篇目录