【直播聊天室】Android開發(fā)指南

基本概念

一、融云直播聊天室介紹

融云直播聊天室,是專門為視頻直播業(yè)務(wù)提供的一個產(chǎn)品。主要特點是:

1.可以支持無人數(shù)上限的直播聊天室;

2.支持海量消息的并發(fā),消息速度極快;

3.并可以方便的為直播聊天室實現(xiàn)彈幕、點贊、禮物、成員進(jìn)入等消息通訊功能。

以上可以極大的節(jié)約視頻直播產(chǎn)品的開發(fā)和運營成本。目前融云承擔(dān)的日消息分發(fā)量峰值已經(jīng)超過 1000 億。

二、解決方案主要構(gòu)成

融云的視頻直播聊天室方案,由兩部分構(gòu)成,視頻直播 SDK 和融云聊天室 SDK。后者由融云提供,前者你使用自己的推流和拉流來實現(xiàn),或者使用第三方成熟的 SDK 來實現(xiàn)。融云的開源視頻直播室 App 里整體方案為您打包了金山云視頻 SDK,同時我們也支持七牛,樂視,阿里,UCldou等視頻云 SDK。

1.視頻直播 SDK

主播端

主播端使用的推流 SDK,主播需要把攝像頭采集的視頻源做編碼,然后推到視頻直播云上。

觀眾端

觀眾端使用的是拉流 SDK,觀眾需要的是把視頻從服務(wù)端拉倒本地,做解碼,并展示到手機(jī)終端上。觀眾端還必須包括一個視頻播放器。

您也可以把以上的主播端和觀眾端打包到同一個 App 里,同時提供主播推流功能,又提供觀眾端拉流觀看的功能。融云直播聊天室對于以上幾種模式的支持都是完全相同的。

2.融云聊天室 SDK

IMLib

IMLib 是融云的 SDK 的一個產(chǎn)品組件,提供的是基礎(chǔ)的通信能力,當(dāng)使用融云聊天室的時候,您只需要簡單調(diào)用初始化,連接,加入聊天室,發(fā)送消息等功能。

直播聊天室 App 開源代碼

基于融云的 IMlib SDK,融云把常見的視頻直播聊天室的常用功能封裝成了一個 App,Seal Live。在這個 App 內(nèi),融云實現(xiàn)了登錄,連接,直播界面的顯示,輸入框,發(fā)送接收消息的處理流程,我們建議您直接使用這部分代碼,可以大大的減輕整個聊天室 UI 的開發(fā)工作。

三、常見問題 Q&A

1.是否有系統(tǒng)瓶頸和任何數(shù)量限制?

融云直播聊天室不存在任何系統(tǒng)瓶頸,系統(tǒng)可以實現(xiàn)平滑的橫向擴(kuò)展,支持任意規(guī)模的同時在線用戶消息分發(fā)。

2.消息并發(fā)量過大是否會導(dǎo)致服務(wù)崩潰?

當(dāng)遇到直播高峰,用戶數(shù)與消息量超出系統(tǒng)承載能力時,系統(tǒng)會自動根據(jù)預(yù)先設(shè)定的規(guī)則對消息進(jìn)行拋棄,優(yōu)先拋棄掉低優(yōu)先級消息,確保系統(tǒng)能夠穩(wěn)定運行,不會影響用戶體驗。

3.什么是消息分級與消息拋棄模型

當(dāng)聊天室內(nèi)人數(shù)眾多,消息量會變得非常大,這時可能會出現(xiàn)服務(wù)端超過預(yù)設(shè)承載能力或者分發(fā)的消息量超過客戶端消息接收能力的情況,這時,就需要引入消息分級機(jī)制。

融云并沒有對任何消息進(jìn)行拋棄,但是在消息量極大的情況下,比如1萬人到百萬左右的聊天室內(nèi),消息并發(fā)量極大的情況下,每個用戶端能收發(fā)到的消息和體驗已經(jīng)很悠閑,因此消息拋棄指的是確保用戶端總是能收到最重要的消息,因此不重要的消息看起來就像是被拋棄了。

在開發(fā)過程中,除官方的普通文本消息之外,開發(fā)者需要針對不同的消息類別定義不同的消息類型,以便通過消息的 ObjectName 設(shè)置消息分級。目前融云支持兩級消息分類,分別是高優(yōu)先級消息和低優(yōu)先級消息。當(dāng)發(fā)生消息拋棄行為時,優(yōu)先拋棄低優(yōu)先級消息。

針對主播的消息,可以通過聊天室內(nèi)用戶白名單機(jī)制,將主播添加到白名單以確保主播消息不會被拋棄掉。

自定義消息文檔請參見:http://www.rongcloud.cn/docs/android_architecture.html?和http://www.rongcloud.cn/docs/ios_architecture.html

4.直播聊天室的成本結(jié)構(gòu)是如何的?

直播聊天室的成本結(jié)構(gòu)主要包括兩大部分:

1) 服務(wù)器成本:主要包括維持同時現(xiàn)在用戶長連接的連接服務(wù)器成本和負(fù)責(zé)分發(fā)消息的消息服務(wù)器成本,還有極少量的基礎(chǔ)功能服務(wù)器成本。

2) 流量成本:流量成本決定于系統(tǒng)最終分發(fā)的消息量和消息尺寸。為了降低成本,開發(fā)者在設(shè)計時要注意控制消息序列化之后的尺寸,也可以從業(yè)務(wù)角度優(yōu)化消息量。注意:消息流量是 IDC 流量,與直播視頻流使用的 CDN 流量成本有巨大差別,不可放在一起比較。

5.我還需要關(guān)注如何優(yōu)化消息嗎?

是的。聊天室作為一種特殊的場景,其消息分發(fā)量是海量的,比如 1 萬人的聊天室,如果實時在線的人每個人同時發(fā)送1條消息,那消息分發(fā)量就是 1萬 X 1萬 等于 1 億的消息并發(fā)。因此您需要注意控制用戶端發(fā)送消息的頻率。比如常見的點贊消息,用戶端可以非??焖俚狞c贊,但建議你做成消息歸并,每 1 秒再發(fā)送一條消息,每條點贊消息內(nèi)攜帶一個數(shù)字,這個數(shù)字表示在 1 秒內(nèi)該用戶點贊了幾次。這樣可以大大減少消息并發(fā)量。

四、開始集成融云 IM 需要了解的概念

1.appKey

2.token

3.userId

4.會話

conversationType

targetId

5.消息

消息類型

融云 IM 是如何運轉(zhuǎn)、如何與 App 交互的

使用融云 IM 聊天室之前,必須要先初始化 SDK 并建立與融云服務(wù)器的連接。?

connect 成功之后,融云提供兩種加入聊天室的方式。

1、App Server 創(chuàng)建聊天室,客戶端調(diào)用 joinExistChatRoom 加入聊天室。?

2、App Server 只管理聊天室 Id列表,客戶端調(diào)用joinChatRoom加入聊天室,如果聊天室不存在則自動創(chuàng)建。?

融云 Sever API 也提供了將用戶加入聊天室的接口,但是不要通過此接口將普通用戶加入聊天室中,否則會導(dǎo)致聊天室自動?;畹墓δ苁?。 一些記錄功能的賬號可以通過 Server API /chatroom/join 接口加入聊天室,但是普通用戶需要調(diào)用 SDK 的 joinExistChatRoom 或 joinExistChatRoom 加入聊天室。

一、App 服務(wù)器端需要做什么?

1.管理用戶體系和融云 userId 的映射關(guān)系

融云不維護(hù)用戶體系和好友關(guān)系,App 需要為您用戶體系中的每個用戶和融云的 userId 建立一一對應(yīng)的映射關(guān)系。之后就可以根據(jù) userId,加入、退出聊天室并收發(fā)消息。

2.實現(xiàn)從融云獲取 token 的邏輯

3.根據(jù)App的產(chǎn)品邏輯,維護(hù)每個聊天室的信息和聊天室列表

二、App 服務(wù)器還可以做什么?

1.創(chuàng)建、銷毀聊天室

2.查詢聊天室的信息

3.查詢聊天室中的用戶列表

4.用戶禁言、封禁

5.敏感詞過濾

6.消息分級

7.全球節(jié)點

三、App 客戶端需要做什么?

1.初始化 SDK

2.加入、退出聊天室

3.初始化視頻播放器(多家合作廠家可選)

4.收發(fā)消息

5.文字、表情、點贊、鮮花等編輯、顯示

其中,App以上部分的功能和UI都已經(jīng)實現(xiàn)并開源,可以開箱即用也可以隨意定制。

四、App 客戶端還可以做什么?

1.自定義任意消息及其顯示樣式(也可以不顯示)

2.插入而不發(fā)送消息

3.監(jiān)聽消息收發(fā),App 可以按自己需求控制邏輯和 UI

4.后期可以很方便地集成 IMKit,快速擴(kuò)展出單聊、群聊、黑名單、客服、VoIP 等功能。

Android 直播聊天室Demo 說明

融云直播聊天室 Demo 使用了 IMLib SDK 和第三方的播放 SDK。前者提供聊天消息相關(guān)的基礎(chǔ)服務(wù),后者則負(fù)責(zé)視頻播放控制。開源部分主要為 UI 的繪制及 SDK 的使用控制邏輯。

IMLib 是不含界面的基礎(chǔ) IM 通訊能力庫,封裝了通信能力和會話、消息等對象。引用到工程中后,需要開發(fā)者自己實現(xiàn) UI 界面,相對較輕量,適用于對 UI 有較高訂制需求的開發(fā)者。

直播聊天室 Demo:點擊下載

一、IMLib SDK 集成說明

1.下載 IMLib SDK:點擊下載

2.SDK 目錄結(jié)構(gòu)說明:

? ? ?·libs 目錄 - native so 庫,目前支持 armeabi(含v7及64位),以及 x86 平臺。如有其它平臺需求,請聯(lián)系客服。

? ?res 目錄- 配置及資源文件。

? ? ?·build.gradle - gradle 配置相關(guān),可再此定義編譯版本等信息。

? ? ?·AndroidManifest.xml - SDK 配置文件,可查看 SDK 所需的安卓權(quán)限等信息。

3.導(dǎo)入 IMLib SDK:

? ? ?·將下載的 IMLib 文件夾拷貝到工程根目錄,為方便使用可更名為 imlib。

? ? ? ·在 settings.gradle 里加入 imlib 庫引用,如:

? include ':app', ':imlib'

? ? ? ·在主工程 build.gradle 文件的 dependencies 中加入 imlib 庫引用,如:

? compile project(':imlib')

至此 IMLib SDK 集成完畢,可在主工程里直接調(diào)用其接口。

二、IMLib SDK 使用說明

1、SDK 初始化:

在使用 IMLib 接口前,需要對其做初始化操作,只需調(diào)一次即可。建議在繼承 Application 類的 onCreate 方法中調(diào)用。 接口說明如下:

/**

* @param context 傳入 Application 類的 Context。

* @param appKey? 融云注冊應(yīng)用的 AppKey。

*/

public static void init(Context context, String appKey);

2、注冊消息監(jiān)聽:

在連接融云服務(wù)器前,需要先注冊消息接收監(jiān)聽。這里需要注意,如果在連接之后才注冊監(jiān)聽,可能會有消息遺漏的情況??梢允褂萌缦陆涌谧裕?/p>

/**

* 設(shè)置接收消息事件的監(jiān)聽器。所有接收到的消息、通知、狀態(tài)都經(jīng)由此處設(shè)置的監(jiān)聽器處理。包括私聊消息、討論組消息、群組消息、聊天室消息以及各種狀態(tài)。

* 注意:如果調(diào)用此接口的 Activity 被釋放回收,將無法收到事件回調(diào)。

*

* @param listener 接收消息的監(jiān)聽器。

*/

public static void setOnReceiveMessageListener(final OnReceiveMessageListener listener);

3、獲取Token:

Token 即用戶令牌,相當(dāng)于您 APP 上當(dāng)前用戶連接融云的身份憑證。

在您連接融云服務(wù)器之前,您需要請求您的 App Server,您的 App Server 通過 Server API 獲取 Token 并返回給您的客戶端,客戶端獲取到這個 Token 即可進(jìn)入下一步連接融云服務(wù)器。

為什么必須在服務(wù)器端請求 Token,客戶端不提供獲取 Token 的接口? 因為獲取 Token 時需要提供 App Key 和 App Secret 。如果在客戶端請求 Token,假如您的 App 代碼一旦被反編譯,則會導(dǎo)致您的 App Key 和 App Secret 泄露。所以,務(wù)必在您的服務(wù)器端獲取 Token。

我們在開發(fā)者控制臺提供了 API 調(diào)試的功能,在開發(fā)初期階段,您可以通過其中獲取 Token 功能,手動獲取 Token 進(jìn)行測試。

4、登錄連接:

當(dāng)成功得到 Token 后,可以調(diào)用 connect 接口與融云服務(wù)器進(jìn)行連接。

/**

* 連接服務(wù)器,在整個應(yīng)用程序全局,只需要調(diào)用一次,需在 init 之后調(diào)用。

* 如果調(diào)用此接口遇到連接失敗,SDK 會自動啟動重連機(jī)制進(jìn)行最多 10 次重連,分別是 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 秒后。

* 在這之后如果仍沒有連接成功,還會在當(dāng)檢測到設(shè)備網(wǎng)絡(luò)狀態(tài)變化時再次進(jìn)行重連。

*

* @param token? ? 從服務(wù)端獲取的用戶身份令牌(Token)。

* @param callback 連接回調(diào)。

* @return RongIMClient IM 客戶端核心類的實例。

*/

public static RongIMClient connect(final String token, final ConnectCallback callback);

當(dāng)回調(diào)onSuccess 代表連接成功;若回調(diào) onTokenIncorrect 很可能是 Token 跟 AppKey 不匹配,可以去官網(wǎng)-我的應(yīng)用-運營工具-用戶管理 中檢查確認(rèn);若返回 onError 請根據(jù)錯誤碼進(jìn)行檢查。

5、加入聊天室:

登錄成功后,當(dāng)用戶點擊房間進(jìn)入直播聊天室需要調(diào)用如下接口,打開消息通道:

/**

* 加入聊天室。如果聊天室不存在,sdk 會創(chuàng)建聊天室并加入,如果已存在,則直接加入。加入聊天室時,可以選擇拉取聊天室消息數(shù)目。

*

* @param chatroomId? ? ? 聊天室 Id。

* @param defMessageCount 進(jìn)入聊天室拉取消息數(shù)目,-1 時不拉取任何消息,0 時拉取 10 條消息,最多只能拉取 40 條。

* @param callback? ? ? ? 狀態(tài)回調(diào)。

*/

public void joinChatRoom(final String chatroomId, final int defMessageCount, final OperationCallback callback);

或:

/**

* 加入已存在的聊天室。如果聊天室不存在,則加入失敗。加入聊天室時,可以選擇拉取聊天室消息數(shù)目。

*

* @param chatroomId? ? ? 聊天室 Id。

* @param defMessageCount 進(jìn)入聊天室拉取消息數(shù)目,-1 時不拉取任何消息,0 時拉取 10 條消息,最多只能拉取 40 條。

* @param callback? ? ? ? 狀態(tài)回調(diào)。

*/

public void joinExistChatRoom(final String chatroomId, final int defMessageCount, final OperationCallback callback);

如果聊天室不存在則返回錯誤碼 23410,若人數(shù)超限則返回錯誤碼 23411。

6、發(fā)送消息:

/**

* 發(fā)送消息。

*

* @param message? ? 將要發(fā)送的消息體。

* @param pushContent 當(dāng)下發(fā) push 消息時,在通知欄里會顯示這個字段。聊天室消息一般不需要推送,可設(shè)置為null。

* @param pushData? ? push 附加信息。聊天室消息一般不需要推送,可設(shè)置為null。?

* @param callback? ? 發(fā)送消息的回調(diào),參考IRongCallback.ISendMessageCallback。

*/

public void sendMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMessageCallback callback);

7、用戶信息顯示:

用戶信息由 UserInfo 類來承載,包含用戶 id,昵稱,頭像三部分。聊天室由于用戶流動性大,建議將用戶信息寫入發(fā)送的消息體中。調(diào)用 MessageContent 的接口:

/**

* 將用戶信息寫入消息體內(nèi)

*

* @param info 要寫入的用戶信息。

*/

public void setUserInfo(UserInfo info);

當(dāng)收到信息后,通過調(diào)用 getUserInfo,得到 UserInfo 類,進(jìn)而得到發(fā)送者的信息。

/**

* 獲取消息體內(nèi)的用戶信息。

*/

public UserInfo getUserInfo()

8、退出聊天室:

當(dāng)用戶退出房間,需要調(diào)用如下接口:

/**

* 退出聊天室。

*

* @param chatroomId 聊天室 Id。

* @param callback? 狀態(tài)回調(diào)。

*/

public void quitChatRoom(final String chatroomId, final OperationCallback callback);

9、斷開連接:

通常直播聊天室應(yīng)用,退出后不需要接受離線消息。調(diào)用下面接口即可:

/**

* 斷開與融云服務(wù)器的連接,并且不再接收Push 消息。

* 若想斷開連接后仍然接受 Push 消息,可以調(diào)用disconnect()

*/

public void disconnect();

三、自定義消息相關(guān)

除了 IMLib 內(nèi)建的幾種消息外,當(dāng)有特殊需求時也可以自定義消息,基本概念請參看文檔。需要通過如下接口注冊才能使用。

/**

* 用于自定義消息的注冊, 注冊后方能正確識別自定義消息, 建議在 init 后及時注冊,保證自定義消息到達(dá)時能正確解析。

*

* @param messageContentClass 消息類型,必須要繼承自 MessageContent。

* @throws AnnotationNotFoundException 如果沒有找到注解時拋出。

*/

public static void registerMessageType(Class messageContentClass);

Demo 中自定義了一種消息類型 GiftMessage,以及它的 UI 展示類 GiftMsgView。開發(fā)者可以參考它的實現(xiàn)以及注冊方法。

四、直播聊天室 Demo 對 IMLib 的封裝

融云直播聊天室 Demo 中的 LiveKit 類是對 IMLib 庫的接口封裝類。目的是在 IMLib 庫眾多通用接口中,提煉出與直播聊天室應(yīng)用相關(guān)的常用接口,方便開發(fā)者了解 IMLib 庫的調(diào)用流程,降低學(xué)習(xí)成本。同時也開發(fā)者可以此為基礎(chǔ)擴(kuò)展,并快速移植到自己的應(yīng)用中去。

注意:此種封裝并不是集成 IMLib 庫的唯一方法,開發(fā)者可以根據(jù)自身需求添加修改,或者直接使用 IMLib 接口。

五、直播聊天室 Demo 對消息的展示

IMLib 庫自帶若干種消息類型,但這些消息如何展示在用戶界面上,還需要對應(yīng)的消息展示類。Demo 里提供了一種實現(xiàn)思路,即每一個消息類型對應(yīng)一個消息展示類,通過 LiveKit.registerMessageView 方法將其注冊關(guān)聯(lián)。

消息展示類需要繼承了 BaseMsgView,并實現(xiàn)構(gòu)造函數(shù)跟 setContent 函數(shù)。其中構(gòu)造函數(shù)負(fù)責(zé)加載布局元素,setContent 方法負(fù)責(zé)填充數(shù)據(jù)。最終由 ChatListAdapter 顯示在 ListView 中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容