云信小课堂|简单五步,轻松构建本土「Clubhouse」
Vol. 2
最近 Clubhouse 一碼難求,獲得眾多互聯網圈和投資圈人士的關注,一時之間風靡全球。
但受限于各方面原因,Clubhouse 目前還是存在很多限制,比如采用邀請機制、只能 iOS 用戶下載以及國內 Apple 賬號無法下載等。
就產品本身而言,作為一個初創的即時語聊產品,Clubhouse 也不可避免地存在如房間被動退出、語音延遲性等問題,而這也是國外用戶反映普遍存在的問題。
盡管如此,Clubhouse 的突然火爆,還是讓我們看到了即時語聊市場的龐大需求,聲音社交仍有廣泛的空間。
為了更快地幫助國內一些即將或者已經開始著手搭建即時語音聊天的企業了解 Clubhouse,搶占先機,本篇文章將從產品設計、技術實現以及在搭建中可能存在的技術難點幾個維度,進行全面的分析和解讀。
只需五步,即可輕松構建本土「Clubhouse」!
架構設計
客戶端組件:封裝實現客戶端與應用服務 Clubhouse Server 的交互,封裝實現與音視頻的交互。
網關代理:應用服務的網關服務。
Clubhouse Server:仿 ClubHouse 應用服務。
網易 G2 音視頻 RTC 服務:提供穩定流暢、高品質、全平臺的點對點和多人實時音視頻通話服務,其中包括:
網易云信 IM SDK
網易云信 G2 SDK
架構圖如下:
核心流程
分解一下需求,除去用戶標簽、房間標簽和話題推薦,Clubhouse 的功能大概分為以下幾個板塊:
房間列表
創建/加入房間
管理員邀請用戶
舉手發言
離開房間
其中,整體的房間控制需要在網易云信 G2 音視頻 SDK 的基礎之上,借助服務端來控制;加入房間后的音視頻能力,則直接由 SDK 提供;另外服務端通知則由網易云信 IM SDK 提供的長鏈接服務來負責傳遞。
詳細流程如下:
1
獲取房間列表
在這一步中,我們調用服務端接口獲取到房間列表。
2
創建/加入房間
在這一步中,不論是創建房間還是加入房間,都會調用服務端提供的 /clubRoom/join 接口。
在用戶加入到 channelName 房間時,應用服務器會判斷 channelName 是否存在。
如果對應房間不存在,會創建一個房間并加入同時返回相應的房間信息;如果傳入 channelName 存在,則用戶直接加入該房間。
當獲取到服務端返回的房間信息時,再調用 G2 SDK 的加入房間 API joinChannelWithToken,真正加入音頻房間。
當加入房間成功后,G2 SDK 會抄送消息至應用服務器,更新用戶在房間中的狀態。
3
管理員邀請用戶加入房間
當管理員點擊邀請用戶加入房間時,會先獲取到好友列表,然后服務端生成一個短鏈返回到客戶端。當被邀請者點擊短鏈后,會自動加入房間。
4
舉手發言
在這一步中,客戶端會先調用/clubRoom/handsup接口,告訴服務端我想發言。
然后,服務端通過云信 IM 提供的透傳協議以及長鏈接將消息發送給房間管理員。
管理員點擊同意時,會調用管理員會控接口/clubRoom/control/host更新成員音頻狀態為「發言狀態」,同時應用服務器通過 IM 透傳協議通知舉手者音頻已打開,此時舉手者調用 G2 的 API enableLocalAudio 來開啟麥克風。
5
離開房間
最后,當用戶點擊離開房間按鈕后,直接調用 G2 SDK 的 leaveChannel 方法離開房間,此時,G2 會抄送用戶離開消息至應用服務器,服務器標記該用戶離開。
G2 SDK詳細說明
其中,G2 SDK 用到的方法的詳細說明如下:
1. 導入類
在項目中導入 NERtcSDK 類:
#import <NERtcSDK/NERtcSDK.h>2. 初始化
打開 App 后,先執行 - setupEngineWithContext: 方法完成初始化。
@interface Myapp ()<NERtcEngineDelegateEx>...NERtcEngine *coreEngine = [NERtcEngine sharedEngine];NERtcEngineContext *context = [[NERtcEngineContext alloc] init];// 設置通話相關信息的回調context.engineDelegate = self;// 設置當前應用的appKeycontext.appKey = AppKey;[coreEngine setupEngineWithContext:context];...3. 加入房間
加入房間前,請確保已完成初始化相關事項。通過 – joinChannelWithToken:channelName:myUid:completion: 方法加入房間。
// 示例[NERtcEngine.sharedEngine joinChannelWithToken:@""channelName:roomIdmyUid:userIdcompletion:^(NSError * _Nullable error, uint64_t channelId, uint64_t elapesd) {if (error) {//加入失敗} else {//加入成功}}];4. 退出通話房間
通過 leaveChannel 接口退出通話房間。
// 示例// 退出通話房間[NERtcEngine.sharedEngine leaveChannel];NERtcEngineDelegate 提供 – onNERtcEngineDidLeaveChannelWithResult: 來監聽當前用戶退出房間的結果。
技術難點分析
1.音頻技術難點與解決方案
問題描述
弱網情況下的丟包問題
設備適配問題
音質問題
解決方案
云信音視頻通話2.0使用自研的網絡引擎弱網算法,保證在80%丟包的傳輸場景下,音頻也能進行正常通話,弱網優勢更明顯。
云信針對超過數千款設備進行音質適配,保證回聲抑制的效果在絕大多數機型上都有最優的表現。
自研的音頻AI降噪算法,可以針對嘈雜人聲、鍵盤聲等非穩態噪聲進行定向降噪,提升對于環境穩態噪聲的抑制能力,保留更純粹人聲。
2.內容管控技術難題與解決方案
問題描述
對于 Clubhouse 這一類聲音社交的語音聊天室場景,場景中可能出現如暴恐、涉政、色情、廣告等不可控違規內容。隨著有關部門的監管力度不斷增強,平臺對于內容進行管控的工作成為了必要。
實時音頻場景下的內容審核,由于其場景實時進行的特殊性,對反垃圾服務也提出了較為嚴苛的要求。例如,審核結果必須足夠實時,嘈雜場景下的音頻采集不能嚴重影響檢出率,高并發場景下需要做到快速響應不擁塞等等。
解決方案
云信針對該場景打磨出了一套完備的實時音頻反垃圾服務,為客戶的業務合規性保駕護航。該服務通過業內領先的語音識別技術,結合反垃圾文本過濾規則體系,精準、高效分析識別違規音頻。此外,依托網易云計算資源,動態擴容,彈性伸縮,滿足客戶的涉黃、涉政、廣告等其他多維度場景的高并發、高精準的反垃圾檢測。
總? 結
按照如上五步,我們就可以基于網易云信提供的強大的基礎能力,輕松快速地打造一個屬于自己的「Clubhouse」,趕上風口,下一個出圈的就是你!
示例項目
網易云信官網-多人語聊解決方案
http://yunxin.163.com/voicechat
網易云信聊天室 NEChatroom源碼
https://github.com/netease-im/NEChatroom
網易云信G2 SDK iOS端API文檔
https://dev.yunxin.163.com/docs/product/音視頻通話2.0/快速入門/實現音視頻通話/實現音視頻通話(iOS)
網易云信G2 SDK Android端API文檔
http://163.lu/FwUqw1
立即點擊閱讀原文,構建屬于你的「Clubhouse」吧!
總結
以上是生活随笔為你收集整理的云信小课堂|简单五步,轻松构建本土「Clubhouse」的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天天鉴宝联手网易智企,开创直播鉴定服务电
- 下一篇: WebRTC 系列之音频会话管理