轻松构建本土Clubhouse

更新时间: 2024/09/18 16:26:13

本文将从产品设计、技术实现以及在搭建中可能存在的技术难点几个维度,对 Clubhouse 进行全面的分析和解读。只需五步,即可轻松构建本土 Clubhouse。

架构设计

架构图如下:

架构图.png

上图中,各组件说明如下:

  • 客户端:封装实现客户端与应用服务 Clubhouse Server 的交互,封装实现与音视频的交互。

  • 网关代理:应用服务的网关服务。

  • Clubhouse Server:仿 Clubhouse 应用服务。

  • RTC 音视频服务:提供稳定流畅、高品质、全平台的点对点和多人实时音视频通话服务,底层能力包括:

    • 网易云信 IM SDK
    • 网易云信 NERTC SDK

技术原理

除去用户标签、房间标签和话题推荐,Clubhouse 的功能大概分为以下几个板块:

  • 房间列表
  • 创建/加入房间
  • 管理员邀请用户
  • 举手发言
  • 离开房间

其中,整体的房间控制需要在网易云信音视频通话 NERTC SDK 的基础之上,借助服务端来控制;加入房间后的音视频能力,则直接由 NERTC SDK 提供;另外服务端通知则由网易云信 IM SDK 提供的长链接服务来负责传递。

详细流程如下:

第一步:获取房间列表

调用服务端 /clubRoom/list 接口获取到房间列表。

获取房间列表.png

第二步:创建并加入房间

不论是创建房间还是加入房间,都会调用服务端提供的 /clubRoom/join 接口。在用户加入到房间时,应用服务器会判断 channelName 是否存在。

  • 如果对应的 channelName 不存在,会创建一个房间并加入同时返回相应的房间信息。
  • 如果对应的 channelName 存在,则用户直接加入该房间。

当获取到服务端返回的房间信息时,再调用 NERTC SDK 的加入房间 API joinChannelWithToken,真正加入音频房间。

当加入房间成功后,NERTC SDK 会抄送消息至应用服务器,更新用户在房间中的状态。

创建并加入房间.png

第三步:管理员邀请用户加入房间

当管理员点击邀请用户加入房间时,会先获取到好友列表,然后服务端生成一个短链返回到客户端。当被邀请者点击短链后,会自动加入房间。

管理员邀请用户加入房间.png

第四步:举手发言

  1. 客户端会先调用 /clubRoom/handsup 接口,告诉服务端我想发言。
  2. 服务端通过云信 IM 提供的透传协议以及长链接将消息发送给房间管理员。
  3. 管理员点击同意时,会调用管理员会控接口 /clubRoom/control/host 更新成员音频状态为发言状态,同时应用服务器通过 IM 透传协议通知举手者音频已打开,此时举手者调用 NERTC 的 enableLocalAudio 接口来开启麦克风。

举手发言.png

管理员同意成员举手发言.png

第五步:离开房间

当用户点击离开房间按钮后,直接调用 NERTC SDK 的 leaveChannel 方法离开房间,此时,NERTC 会抄送用户离开消息至应用服务器,服务器标记该用户离开。

离开房间.png

实现方法

  1. 导入类

    在项目中导入 NERtcSDK 类:

#import <NERtcSDK/NERtcSDK.h>
  1. 初始化

    打开 App 后,先执行 setupEngineWithContext: 方法完成初始化。

  @interface Myapp ()<NERtcEngineDelegateEx>
    ...
    NERtcEngine *coreEngine = [NERtcEngine sharedEngine];
    NERtcEngineContext *context = [[NERtcEngineContext alloc] init];
    // 设置通话相关信息的回调
    context.engineDelegate = self;
    // 设置当前应用的appKey
    context.appKey = AppKey;
    [coreEngine setupEngineWithContext:context];
    ...
  1. 加入房间

    加入房间前,请确保已完成初始化相关事项。通过 joinChannelWithToken 方法加入房间。

  // 示例
  [NERtcEngine.sharedEngine joinChannelWithToken:@""
                                     channelName:roomId
                                           myUid:userId
                                      completion:^(NSError * _Nullable error, uint64_t channelId, uint64_t elapesd) {
                                                          if (error) {
                                                              //加入失败
                                                          } else {
                                                              //加入成功
                                                          }
                                        }];

  1. 退出通话房间

    通过 leaveChannel 接口退出通话房间。

// 示例
  // 退出通话房间
  [NERtcEngine.sharedEngine leaveChannel];

NERtcEngineDelegate 提供 onNERtcEngineDidLeaveChannelWithResult: 接口来监听当前用户退出房间的结果。

相关参考

技术难点分析

音频技术难点与解决方案

问题描述

  • 弱网情况下的丢包问题
  • 设备适配问题
  • 音质问题

解决方案

  1. 云信音视频通话 2.0 使用自研的网络引擎弱网算法,保证在 80% 丢包的传输场景下,音频也能进行正常通话,弱网优势更明显。

  2. 云信针对超过数千款设备进行音质适配,保证回声抑制的效果在绝大多数机型上都有最优的表现。

  3. 自研的音频 AI 降噪算法,可以针对嘈杂人声、键盘声等非稳态噪声进行定向降噪,提升对于环境稳态噪声的抑制能力,保留更纯粹人声。

内容管控技术难题与解决方案

问题描述

  • 对于 Clubhouse 这一类声音社交的语音聊天室场景,场景中可能出现如暴恐、涉政、色情、广告等不可控违规内容。随着有关部门的监管力度不断增强,平台对于内容进行管控的工作成为了必要。

  • 实时音频场景下的内容审核,由于其场景实时进行的特殊性,对反垃圾服务也提出了较为严苛的要求。例如,审核结果必须足够实时,嘈杂场景下的音频采集不能严重影响检出率,高并发场景下需要做到快速响应不拥塞等等。

解决方案

云信针对该场景打磨出了一套完备的实时音频反垃圾服务,为客户的业务合规性保驾护航。

该服务通过业内领先的语音识别技术,结合反垃圾文本过滤规则体系,精准、高效分析识别违规音频。此外,依托网易云计算资源,动态扩容,弹性伸缩,满足客户的涉黄、涉政、广告等其他多维度场景的高并发、高精准的反垃圾检测。

具体实现方式请参见实现音视频安全检测

安全通.png

此文档是否对你有帮助?
有帮助
去反馈
  • 架构设计
  • 技术原理
  • 第一步:获取房间列表
  • 第二步:创建并加入房间
  • 第三步:管理员邀请用户加入房间
  • 第四步:举手发言
  • 第五步:离开房间
  • 实现方法
  • 相关参考
  • 技术难点分析
  • 音频技术难点与解决方案
  • 内容管控技术难题与解决方案