導(dǎo)讀|隨著互聯(lián)網(wǎng)出海的熱潮襲來,語聊社交出海再度掀起新一輪風(fēng)口,國(guó)內(nèi)外基于語音聊天室的社交APP如雨后春筍般涌現(xiàn)出來。然而隨著國(guó)內(nèi)同質(zhì)化競(jìng)爭(zhēng)加劇,大量國(guó)內(nèi)團(tuán)隊(duì)選擇出海分一杯羹。那么海外語聊社交場(chǎng)景有什么特點(diǎn)?其實(shí)現(xiàn)方案又與國(guó)內(nèi)有何不同?讀完本文,你將能夠理解并掌握基于騰訊云音視頻搭建語聊房的基本要素,以及海外語聊方案的具體實(shí)現(xiàn)和優(yōu)化思路。
語聊社交的典型形態(tài)就是語聊房,語聊房是指在線語音連麥虛擬房間,每個(gè)房間通常設(shè)有 5-10 個(gè)麥位,主播和連麥觀眾在麥上聊天,其他觀眾可以進(jìn)入房間觀看。不同房型的麥位數(shù)量和房間內(nèi)可容納最大觀眾數(shù)量不同。
在語聊房場(chǎng)景中,房主和幾名麥上用戶以語音的方式在線互動(dòng),麥下觀眾不能發(fā)言只能收聽,通過贈(zèng)送禮物和聊天消息互動(dòng)。房間通常會(huì)設(shè)置不同的主題類型,以吸引具有相同愛好的用戶觀看互動(dòng)。語聊房目前比較常見的形式有1V1語聊房、多人語聊房、電臺(tái)語聊房、KTV語聊房。
【資料圖】
1)1V1語聊房
1V1語聊房常見的應(yīng)用場(chǎng)景有單聊、陪聊、語音匹配交友等,大部分社交類App都上線了1V1語聊功能,通常分為免費(fèi)和付費(fèi)兩種模式。
2)多人語聊房
多人語聊房延伸出的玩法非常多,其中每種玩法都有所差別。除了多人純語聊,還有跟其他娛樂形式結(jié)合的玩法。比如在線會(huì)議、游戲開黑、賽事直播、一起看電影等。
3)電臺(tái)語聊房
在電臺(tái)語聊房場(chǎng)景中,通常會(huì)有主播單人直播或主持人和幾名陪聊嘉賓,同時(shí)播放背景音樂和音效,麥下觀眾可以贈(zèng)送禮物,上麥參與語音互動(dòng)。
4)KTV語聊房
在KTV語聊房場(chǎng)景中,大家可以點(diǎn)歌、接唱、合唱等,主要分為排麥獨(dú)唱和實(shí)時(shí)合唱兩種模式。 排麥獨(dú)唱為一個(gè)人主唱,其他連麥用戶排隊(duì)等候輪唱。 實(shí)時(shí)合唱為多個(gè)人同時(shí)合唱,連麥用戶可以隨時(shí)申請(qǐng)加入合唱。
通常一個(gè)完整的語聊社交應(yīng)用,根據(jù)功能的完整度,可以分為四個(gè)層級(jí):基礎(chǔ)組件、功能層、應(yīng)用層、業(yè)務(wù)層。整體架構(gòu)如下所示,接下來會(huì)逐個(gè)講解各層級(jí)的內(nèi)容,以對(duì)搭建語聊房的基本要素有個(gè)比較完整的認(rèn)知。
● 基礎(chǔ)組件:提供最基礎(chǔ)的能力,比如音頻互動(dòng)、文字交流、回放存儲(chǔ)等,該組件主要以SDK或者某一單獨(dú)的服務(wù)呈現(xiàn),比如實(shí)時(shí)音視頻SDK、即時(shí)通信IM SDK、直播/點(diǎn)播服務(wù)、審核服務(wù)等。
● 功能層:基礎(chǔ)組件中能力的應(yīng)用,比如彈幕,就是使用到即時(shí)通信IM SDK中的文字交流的能力;還有麥位移動(dòng),是指麥位列表中的某人的麥位進(jìn)行了變更,也是借助了即時(shí)通信IM的信令能力,將某人麥位變化的信息下發(fā)到房間內(nèi)。
● 業(yè)務(wù)層:功能模塊的聚合,比如創(chuàng)建房間、房間列表、進(jìn)/退房就是房間管理的聚合;上/下麥、麥位移動(dòng)、麥位禁言、鎖麥/解鎖麥就是麥位管理的聚合。
● 應(yīng)用層:最終呈現(xiàn)給用戶的業(yè)務(wù)形態(tài),比如1V1語聊、多人語聊、語音電臺(tái)等都是業(yè)務(wù)層根據(jù)一定玩法形態(tài)展現(xiàn)給用戶的。
在整個(gè)語聊技術(shù)架構(gòu)實(shí)現(xiàn)中,難度最大的是基礎(chǔ)組件的實(shí)現(xiàn)。如果完全進(jìn)行自研的話,開發(fā)成本高而且周期較長(zhǎng)。比如開發(fā)實(shí)時(shí)音視頻組件,就需要具備專業(yè)的音視頻底層技術(shù)開發(fā)能力,還需要處理一系列的機(jī)型適配、漏回音、無聲、節(jié)點(diǎn)部署、網(wǎng)絡(luò)互通等復(fù)雜問題。為此我們可以考慮使用云上提供的基礎(chǔ)組件,站在巨人的肩膀上,能夠有效降低開發(fā)成本,實(shí)現(xiàn)快速上線。
騰訊云提供了豐富的基礎(chǔ)組件,能滿足實(shí)現(xiàn)語聊房所需的基礎(chǔ)組件。接下來將基于騰訊云提供的基礎(chǔ)組件,對(duì)語聊房架構(gòu)實(shí)現(xiàn)進(jìn)行詳細(xì)的講解,并從核心業(yè)務(wù)模塊中的房間管理、麥位管理、音視頻流管理,錄制與審核,貫穿核心功能進(jìn)行分析。
語聊社交主要是在一個(gè)個(gè)房間內(nèi)進(jìn)行語音互動(dòng)的,創(chuàng)建房間的用戶是為主播,其他進(jìn)入房間的用戶為觀眾。房間管理主要負(fù)責(zé)對(duì)一個(gè)個(gè)房間進(jìn)行管理,主要功能包括對(duì)房間的創(chuàng)建、銷毀、加入、退出。
在房間管理的實(shí)現(xiàn)中,主要有房間列表、房間創(chuàng)建/銷毀/進(jìn)入/退出的功能。功能看似比較簡(jiǎn)單,是否由業(yè)務(wù)側(cè)自己完全實(shí)現(xiàn)就可以了呢?答案是否定的,因?yàn)榉块g內(nèi)使用的其他功能,比如消息收發(fā)、信令收發(fā)、音頻流收發(fā),都使用到了即時(shí)通信IM與實(shí)時(shí)音視頻TRTC的能力。既然IM和TRTC都有房間管理,是否直接基于這兩個(gè)基礎(chǔ)組件就能快速實(shí)現(xiàn)呢?答案也是否定的,因?yàn)榉块g中的業(yè)務(wù)側(cè)信息,比如鏈路情況、禮物列表,主播頭像等信息和房間列表等功能,IM和TRTC不直接提供此類功能,所以在整個(gè)房間管理中,必須由業(yè)務(wù)側(cè)房間模塊(管理服務(wù)/列表服務(wù))、即時(shí)通信IM模塊(SDK/后臺(tái))、TRTC模塊(SDK/后臺(tái))三大模塊進(jìn)行組合實(shí)現(xiàn)。具體的架構(gòu)流程如下圖所示:
在房間管理的實(shí)現(xiàn)中會(huì)區(qū)分不同的角色,主要分為房主、聽眾兩種角色。
角色 | 描述 | 區(qū)別 |
---|---|---|
房主 | 房間最高權(quán)限的擁有者,可以創(chuàng)建或者銷毀房間 | ● 角色必須為主播● 創(chuàng)建或者銷毀業(yè)務(wù)房間/IM群組/TRTC房間 |
聽眾 | 房間的參與者,也可以上麥變成主播 | ● 角色可以為觀眾/主播● 進(jìn)退房間 |
不同角色的具體實(shí)現(xiàn)流程如下:
房主
1. 通過業(yè)務(wù)側(cè)接口創(chuàng)建相應(yīng)的房間;
2. 創(chuàng)建IM群組;
3. 進(jìn)入業(yè)務(wù)房間/IM群組/TRTC房間,與其他人進(jìn)行互動(dòng);
4. 退出IM群組/TRTC房間/業(yè)務(wù)房間;
5. 銷毀IM群組/業(yè)務(wù)房間。
聽眾
1. 獲取房間列表;
2. 進(jìn)入業(yè)務(wù)房間/IM群組/TRTC房間,與其他人進(jìn)行互動(dòng);
3. 退出IM群組/TRTC房間/業(yè)務(wù)房間。
下面將結(jié)合騰訊云即時(shí)通信IM SDK與實(shí)時(shí)音視頻TRTC SDK來描述整個(gè)房間管理的API調(diào)用細(xì)節(jié),圖中IM SDK核心類為V2TIMManager,TRTC SDK核心類為TRTCCloud。
房主API調(diào)用時(shí)序:
聽眾API調(diào)用時(shí)序:
語聊房?jī)?nèi)的麥位一般都是有序且有限的,比如聽眾上麥一般需要經(jīng)得房主的同意后有序上麥,并且房間內(nèi)的麥位數(shù)量通常在 5-10個(gè)之間。麥位管理主要負(fù)責(zé)根據(jù)業(yè)務(wù)場(chǎng)景定義房間內(nèi)的麥位數(shù)量,以及當(dāng)前房間所有麥位的狀態(tài)管理。麥位管理主要包含上/下麥、換麥、鎖麥位、邀請(qǐng)上麥、麥位禁言等功能。
在麥位管理的實(shí)現(xiàn)中,主要有抱人上麥、踢人下麥、麥位禁言、麥位移動(dòng)、麥位靜音等功能。首先需要業(yè)務(wù)后臺(tái)維護(hù)一套用戶麥位列表狀態(tài)的信息,即為業(yè)務(wù)麥位服務(wù),而在用戶上麥/下麥的時(shí)候,則需要用到即時(shí)通信IM的能力,將用戶上下麥與房主同意的相關(guān)信令下發(fā)到客戶端。然后在用戶進(jìn)行語音互動(dòng)交流的時(shí)候,則需要用到實(shí)時(shí)音視頻TRTC的能力,調(diào)用TRTC SDK接口開啟語音推拉流。所以在整個(gè)麥位管理中,必須是由業(yè)務(wù)側(cè)麥位模塊(管理服務(wù)/列表服務(wù))、即時(shí)通信IM模塊(SDK/后臺(tái))、TRTC 模塊(SDK/后臺(tái))三大模塊進(jìn)行組合實(shí)現(xiàn)的。然而正因?yàn)橛脩羯消?下麥所用到的模塊比較多,任意模塊與其他模塊出現(xiàn)狀態(tài)不統(tǒng)一的時(shí)候,都會(huì)出現(xiàn)“幽靈麥”現(xiàn)象,關(guān)于“幽靈麥”后續(xù)章節(jié)會(huì)展開詳細(xì)介紹。因此每個(gè)模塊都需要按照一定的流程正確進(jìn)行,具體的架構(gòu)流程如下圖所示:
在麥位管理的實(shí)現(xiàn)中會(huì)區(qū)分不同的角色,主要分為房主、聽眾兩種角色。
角色 | 描述 | 區(qū)別 |
---|---|---|
房主 | 麥位最高權(quán)限者,負(fù)責(zé)所有麥位的管理,房主退房后會(huì)自動(dòng)解散所有麥位 | ● 角色必須為主播● 進(jìn)房自動(dòng)上麥● 同意/拒絕上麥申請(qǐng)● 抱人上/下麥● 管理麥位的靜音/解禁● 管理麥位的封禁/解禁 |
聽眾 | 房間內(nèi)麥位參與者,可以上下麥互動(dòng) | ● 角色可以為觀眾/主播● 申請(qǐng)上/下麥 |
不同角色的具體實(shí)現(xiàn)流程如下:
房主
1. 房主創(chuàng)建并加入房間;
2. 根據(jù)房間屬性獲取到麥位列表,并主動(dòng)上麥;
3. 聽眾上麥有兩種方式,一種是聽眾主動(dòng)申請(qǐng)上麥,房主同意,另外一種是房主邀請(qǐng)聽眾上麥,聽眾同意;
4. 聽眾上麥后,與麥位上的其他人進(jìn)行互動(dòng);
5. 聽眾下麥有兩種方式,一種是聽眾主動(dòng)下麥,另外一種是房主將聽眾抱下麥;
6. 房主退出并銷毀房間;
聽眾
1. 聽眾進(jìn)入房間;
2. 聽眾獲取麥位列表;
3. 聽眾申請(qǐng)上麥,房主同意后,將上麥與麥上其他主播互動(dòng);
4. 聽眾退出房間;
以下將結(jié)合騰訊云即時(shí)通信IM SDK與實(shí)時(shí)音視頻產(chǎn)品TRTC SDK來描述整個(gè)麥位管理的API調(diào)用細(xì)節(jié),圖中IM SDK核心類為V2TIMManager,TRTC SDK核心類為TRTCCloud。
音頻流管理是將房間內(nèi)TRTC SDK采集到的房主/主播的聲音經(jīng)過網(wǎng)絡(luò)傳輸后,再拉流并播放給聽眾。其中拉流有兩種方案:TRTC房間訂閱拉流、轉(zhuǎn)推CDN直播拉流。
1) TRTC房間訂閱拉流:通常小規(guī)模語聊房場(chǎng)景可以選擇純RTC流接入方案,技術(shù)復(fù)雜度更低,亦可體驗(yàn)到更好的實(shí)時(shí)互動(dòng)特性;
2) 轉(zhuǎn)推CDN直播拉流:由于TRTC采用UDP協(xié)議進(jìn)行音視頻數(shù)據(jù)的傳輸,而標(biāo)準(zhǔn)直播CDN則采用RTMP\HLS\FLV等協(xié)議進(jìn)行數(shù)據(jù)傳輸,所以需要將TRTC的音視頻數(shù)據(jù)旁路到直播CDN中,才能在讓觀眾通過直播CDN拉流觀看。
1)RTC流訂閱模式
純RTC流接入方案易用性強(qiáng),且具備最佳的實(shí)時(shí)互動(dòng)性。如下圖所示,以麥上用戶和麥下觀眾兩個(gè)角色展示了一種最經(jīng)典的實(shí)時(shí)互動(dòng)語聊房的推拉流方案架構(gòu)。
針對(duì)房間內(nèi)的實(shí)時(shí)流訂閱,TRTC共有兩種訂閱模式可供選擇:自動(dòng)訂閱、手動(dòng)訂閱。
● 自動(dòng)訂閱:默認(rèn)模式,用戶在進(jìn)入房間后會(huì)立刻接收到該房間中的音頻流,音頻會(huì)自動(dòng)播放;
● 手動(dòng)訂閱:用戶進(jìn)入房間后,需要手動(dòng)調(diào)用muteRemoteAudio啟動(dòng)音頻的播放。
在絕大多數(shù)場(chǎng)景下,用戶進(jìn)入房間后都會(huì)訂閱房間中所有主播的音頻流,因此TRTC默認(rèn)采用了自動(dòng)訂閱模式,以求得最佳的“秒開體驗(yàn)”。 而手動(dòng)訂閱模式則具備更好的靈活性和可定制性,用戶可以選擇性地訂閱音頻流。
2)CDN流拉取方案
CDN直播觀看,也叫 “CDN 旁路直播”。TRTC的低延時(shí)觀看能力,單房間支持的最大人數(shù)上限為10萬人。CDN觀看雖然延遲要高一些,但支持10萬人以上的并發(fā)觀看,且CDN的計(jì)費(fèi)價(jià)格相對(duì)便宜。
下面將以四種拉流方案為例,從技術(shù)難度、費(fèi)用成本、觀看效果、人數(shù)限制、應(yīng)用場(chǎng)景等維度進(jìn)行對(duì)比分析:
拉流方案 | 技術(shù)難度 | 費(fèi)用成本 | 觀看效果 | 人數(shù)限制 | 應(yīng)用場(chǎng)景 |
---|---|---|---|---|---|
RTC單流 | 簡(jiǎn)單 | 中等 | 低延遲 | 10萬 | 互動(dòng)游戲房等 |
RTC混流 | 復(fù)雜 | 中等 | 低延遲 | 10萬 | KTV語聊房等 |
CDN單流 | 中等 | 較低 | 中高延遲 | 無限制 | 強(qiáng)自定義布局 |
CDN混流 | 復(fù)雜 | 較低 | 中高延遲 | 無限制 | 規(guī)模并發(fā)觀看 |
由于國(guó)內(nèi)外相關(guān)監(jiān)管政策的要求,有對(duì)語聊房音頻內(nèi)容進(jìn)行錄制存儲(chǔ)的需求。錄制與審核的相關(guān)介紹如下:
在錄制與審核管理中,主要有錄制、審核、用戶封禁等功能。首先需要業(yè)務(wù)后臺(tái)維護(hù)錄制相關(guān)的服務(wù),用來管理主播的回看與調(diào)用TRTC后臺(tái)或者CDN開啟錄制服務(wù),然后在TRTC后臺(tái)/CDN收到業(yè)務(wù)側(cè)的服務(wù)后,將拉到的音視頻流數(shù)據(jù)保持在數(shù)據(jù)存儲(chǔ)中心,一般保存在COS中;另外業(yè)務(wù)后臺(tái)也是需要維護(hù)審核的服務(wù),調(diào)用開啟和接收天御的審核服務(wù)與告警,如果審核確認(rèn)是違規(guī)的內(nèi)容的話,則還需用到即時(shí)通信IM的能力,通過信令通知違規(guī)的用戶下麥。具體的架構(gòu)流程如下圖所示:
1)云端錄制方案
云端錄制是通過TRTC的“啞終端”的方式進(jìn)到TRTC的房間內(nèi)拉流,能對(duì)房間內(nèi)的單流或者合流進(jìn)行錄制,整體的方案可以參考官網(wǎng)文檔,業(yè)務(wù)側(cè)通過調(diào)用相關(guān)的云端錄制接口,進(jìn)行錄制。
2)CDN錄制方案
CDN錄制是通過TRTC后臺(tái)的混流轉(zhuǎn)碼接口/TRTC SDK混流轉(zhuǎn)推接口,混流轉(zhuǎn)碼轉(zhuǎn)推到騰訊云直播/第三方CDN,并通過騰訊云直播/第三方CDN的相關(guān)錄制服務(wù),進(jìn)行錄制。
3) 天御審核方案
TRTC聯(lián)合T-Sec天御,提供了實(shí)時(shí)的音視頻內(nèi)容識(shí)別與告警服務(wù),客戶在使用實(shí)時(shí)音視頻服務(wù)時(shí),支持手動(dòng)或全局自動(dòng)發(fā)起策略進(jìn)行音視頻內(nèi)容的識(shí)別和告警:
● 手動(dòng)自定義審核:客戶只需要調(diào)用天御音視頻流接口即可實(shí)時(shí)檢測(cè)音視頻流中是否出現(xiàn)違規(guī)內(nèi)容,音視頻安全審核服務(wù)會(huì)通過回調(diào)把違規(guī)信息發(fā)送給客戶指定的回調(diào) URL;
● 全局自動(dòng)審核:客戶可指定審核策略和審核流類型,TRTC云端自動(dòng)幫忙完成應(yīng)用下所有房間內(nèi)的音視頻內(nèi)容審核,并通過回調(diào)把違規(guī)信息發(fā)送給客戶指定的回調(diào) URL,無需手動(dòng)發(fā)起審核。
具體實(shí)現(xiàn)接入方案可以參考官網(wǎng)文檔。
4)封禁方案
在內(nèi)容審核服務(wù)監(jiān)測(cè)發(fā)現(xiàn)有違規(guī)內(nèi)容的時(shí)候,通過回調(diào)給業(yè)務(wù)審核的服務(wù),業(yè)務(wù)審核服務(wù)通過機(jī)器/人工再審核的方式的確定是否是違規(guī)內(nèi)容,如果確認(rèn)是違規(guī)的內(nèi)容,則通過即時(shí)通信IM后臺(tái)給違規(guī)的主播發(fā)送封禁消息,主播在收到封禁消息時(shí),停止音視頻流上行。
在整個(gè)語聊技術(shù)架構(gòu)中,核心是實(shí)時(shí)音視頻通信能力。平穩(wěn)且流暢的用戶體驗(yàn),是出海語聊應(yīng)用的制勝法寶。然而,海外紛繁復(fù)雜的基礎(chǔ)設(shè)施和網(wǎng)絡(luò)條件對(duì)于實(shí)時(shí)音視頻的挑戰(zhàn)是巨大的。針對(duì)海外語聊技術(shù)特性,我們總結(jié)了幾點(diǎn)常見問題及其解決方案。
海外部分國(guó)家網(wǎng)絡(luò)基礎(chǔ)設(shè)施薄弱,網(wǎng)絡(luò)整體呈現(xiàn)帶寬低、延遲高、資費(fèi)貴等特性。對(duì)于海外復(fù)雜的網(wǎng)絡(luò)環(huán)境,騰訊云音視頻在全球網(wǎng)絡(luò)部署、QoS&QoE等方面均有針對(duì)性優(yōu)化措施。
騰訊云音視頻在全球70多個(gè)國(guó)家和地區(qū)部署了超過2800個(gè)CDN加速節(jié)點(diǎn),全網(wǎng)帶寬資源儲(chǔ)備高達(dá)200T+。音視頻QoS優(yōu)化針對(duì)海外入網(wǎng)環(huán)境,通過云端智能調(diào)控,確保極端網(wǎng)絡(luò)環(huán)境下引擎策略也可以配置化。云端智能流控引擎可以快速調(diào)整音頻幀長(zhǎng)、FEC比例、JitterBuffer大小等,確保適應(yīng)極端弱網(wǎng)環(huán)境,如限帶寬、高丟包、突發(fā)抖動(dòng)等場(chǎng)景。甚至針對(duì)部分地區(qū)UDP封禁的情況,可以降級(jí)至TCP實(shí)現(xiàn)互聯(lián)互通。
1) 音頻質(zhì)量動(dòng)態(tài)配置
實(shí)時(shí)音視頻TRTC提供了三種精心校調(diào)好的音質(zhì)模式:人聲模式、默認(rèn)模式、音樂模式,用來滿足各種垂直場(chǎng)景下對(duì)音質(zhì)的差異化追求。不同的音質(zhì)模式側(cè)重點(diǎn)各不相同,實(shí)際場(chǎng)景中可以根據(jù)偏好(保音質(zhì)/保流暢)選擇配置。另外,TRTC還支持在通話過程中動(dòng)態(tài)調(diào)整音頻質(zhì)量,以便讓用戶在不同網(wǎng)絡(luò)環(huán)境下均能擁有良好的聽感體驗(yàn)。
音質(zhì)模式 | 音質(zhì)參數(shù) | 音質(zhì)說明 |
---|---|---|
人聲模式 | 采樣率:16k;單聲道;編碼碼率:16kbps | 具備最強(qiáng)的網(wǎng)絡(luò)抗性,在弱網(wǎng)環(huán)境下流暢度最佳 |
默認(rèn)模式 | 采樣率:48k;單聲道;編碼碼率:50kbps | 對(duì)音樂的還原度比人聲模式要好,同時(shí)傳輸數(shù)據(jù)量比音樂模式要低很多 |
音樂模式 | 采樣率:48k;全頻帶立體聲;編碼碼率:128kbps | 音頻傳輸?shù)臄?shù)據(jù)量很大,適合需要高保真?zhèn)鬏斠魳返膱?chǎng)景 |
2)房間內(nèi)音頻混流
在語聊房場(chǎng)景中,一般都有8個(gè)聊天主播,按每人50kpbs音頻碼率計(jì)算的話,觀眾收聽則需要400kpbs的下行帶寬的要求,往往在海外網(wǎng)絡(luò)比較差的環(huán)境中,幾乎無法正常收聽。另外400kpbs的碼率對(duì)部分低端的手機(jī)性能挑戰(zhàn)也是很大,為此我們也通過音頻混流來對(duì)下行帶寬進(jìn)行了優(yōu)化?;谀芰扛?jìng)爭(zhēng)選路的房間內(nèi)音頻混流技術(shù),在確保最終的產(chǎn)品能力和不混流對(duì)齊的情況下,能夠大幅降低用戶下行帶寬,提升弱網(wǎng)抗性。
音頻混流回推:選擇在房間內(nèi)把上行音頻混在一起之后,再推回房間,然后用戶拉流的時(shí)候只需拉一路,就能收到8個(gè)人的聲音,這可以直接把下行帶寬的占用從400k降到50k,對(duì)用戶下行網(wǎng)絡(luò)有極大的改善。示例代碼如下:
// 創(chuàng)建 TRTCPublishTarget 對(duì)象TRTCCloudDef.TRTCPublishTarget target = new TRTCCloudDef.TRTCPublishTarget();// 混流后回推到房間target.mode = TRTCCloudDef.TRTC_PublishMixStream_ToRoom;target.mixStreamIdentity.intRoomId = Integer.parseInt(mRoomId);// 混流機(jī)器人的 userid,不能和房間內(nèi)其他用戶的 userid 重復(fù)target.mixStreamIdentity.userId = mUserId + "_mix"; // 設(shè)置轉(zhuǎn)碼后的音頻流的編碼參數(shù)(可自定義)TRTCCloudDef.TRTCStreamEncoderParam trtcStreamEncoderParam = new TRTCCloudDef.TRTCStreamEncoderParam();trtcStreamEncoderParam.audioEncodedChannelNum = 2;trtcStreamEncoderParam.audioEncodedKbps = 64;trtcStreamEncoderParam.audioEncodedCodecType = 0;trtcStreamEncoderParam.audioEncodedSampleRate = 48000;// 設(shè)置音頻混流參數(shù)TRTCCloudDef.TRTCStreamMixingConfig trtcStreamMixingConfig = new TRTCCloudDef.TRTCStreamMixingConfig();// 支持填寫空值,會(huì)自動(dòng)將所有主播的音頻混合輸出trtcStreamMixingConfig.audioMixUserList = null;// 發(fā)起混流轉(zhuǎn)推請(qǐng)求mTRTCCloud.startPublishMediaStream(target, trtcStreamEncoderParam, trtcStreamMixingConfig);
音頻混流下發(fā)單流音量:對(duì)于拉單流的用戶,能根據(jù)某個(gè)流的音量變化進(jìn)行音浪展示,而通過混流就很難分辨出來了。為此我們通過在云端混流時(shí)將發(fā)言人的userid和音量信息下發(fā)到SEI中,這樣在拉流時(shí)通過解析SEI信息,就能展示單流音量了。
private class TRTCCloudImplListener extends TRTCCloudListener { public void onUserVoiceVolume(ArrayList userVolumes, int totalVolume) { super.onUserVoiceVolume(userVolumes, totalVolume); if (userVolumes != null && userVolumes.size() > 0) { for (TRTCCloudDef.TRTCVolumeInfo user : userVolumes) { // 可以設(shè)置適當(dāng)?shù)囊袅块撝? if (user.volume > 10) { // 更新對(duì)應(yīng)麥位的音浪視圖 updateSeatVoiceView(); // 通過 SEI 消息發(fā)送本地音量信息 if (user.userId.equals(mUserId)) { JSONObject jsonObject = new JSONObject(); jsonObject.put("userid", user.userId); jsonObject.put("volume", user.volume); jsonObject.().getBytes(); mTRTCCloud.sendSEIMsg(jsonObject.().getBytes(), 1); } } } } }}
幽靈麥,又稱炸麥或黑麥,是指不在麥上的用戶能說話,并且其他用戶能聽到其說話的聲音。在海外用戶經(jīng)常會(huì)遇到,如果沒有合適的手段制止的話,會(huì)對(duì)其他用戶體驗(yàn)造成很大的影響。幽靈麥出現(xiàn)的根本原因是業(yè)務(wù)的麥位狀態(tài)跟TRTC房間的推拉流狀態(tài)不一致,可能存在以下幾種情況:
● 聽眾下麥麥位列表更新了,但因IM群組屬性未更新,所以未及時(shí)調(diào)用TRTC切換角色為觀眾和關(guān)閉麥克風(fēng),從而導(dǎo)致處于麥下卻還能發(fā)言;
● 聽眾下麥麥位列表更新了,但調(diào)用了TRTC切換角色接口,因網(wǎng)絡(luò)原因失敗了,從而導(dǎo)致處于麥下卻還能發(fā)言;
● APP被暴力破解,從而導(dǎo)致usersig被黑客截獲,從而能進(jìn)到TRTC房間自由發(fā)言。
應(yīng)對(duì)策略可以分為幾個(gè)步驟:權(quán)限預(yù)防、實(shí)時(shí)檢測(cè)、踢出幽靈麥用戶。
1)權(quán)限預(yù)防
通過開啟TRTC的高級(jí)權(quán)限控制可以更加細(xì)粒度地控制用戶進(jìn)房及上麥權(quán)限,從而防止幽靈麥現(xiàn)象的發(fā)生。開啟高級(jí)權(quán)限控制后,TRTC的后臺(tái)服務(wù)系統(tǒng)不僅會(huì)校驗(yàn)UserSig這一個(gè)“進(jìn)房票據(jù)”,還會(huì)校驗(yàn)一個(gè)叫做PrivateMapKey的“權(quán)限票據(jù)”,權(quán)限票據(jù)中包含了一個(gè)加密后的roomId和一個(gè)加密后的“權(quán)限位列表”。
步驟一:在TRTC控制臺(tái)中開啟高級(jí)權(quán)限控制
當(dāng)某一個(gè)SDKAppid開啟高級(jí)權(quán)限控制后,使用該SDKAppId的所有用戶都需要在TRTCParams中傳入 privateMapKey 參數(shù)才能成功進(jìn)房。
步驟二:在服務(wù)端集成計(jì)算PrivateMapKey
由于客戶端非常容易被逆向破解,從而導(dǎo)致權(quán)限控制失效,因此PrivateMapKey只適合在服務(wù)端計(jì)算再返回給您的App,絕不能在您的App端直接計(jì)算。
步驟三:服務(wù)端下發(fā)鑒權(quán)參數(shù)給客戶端
如下圖所示,當(dāng)您的服務(wù)器計(jì)算好PrivateMapKey之后,就可以在需要的時(shí)候下發(fā)給您的客戶端,SDK會(huì)在進(jìn)房、上麥兩個(gè)時(shí)刻校驗(yàn)PrivateMapKey,你可以在此時(shí)控制用戶權(quán)限。
2)實(shí)時(shí)檢測(cè)幽靈麥用戶
方法一:手動(dòng)訂閱拉流檢測(cè)幽靈麥
基本原理:通過手動(dòng)訂閱模式,在收到遠(yuǎn)端用戶發(fā)布音頻流的回調(diào)中額外校驗(yàn)業(yè)務(wù)麥位狀態(tài),從而決策是否訂閱(播放)該用戶音頻流。
● onUserAudioAvailable(userId, true) 如果該用戶不在業(yè)務(wù)麥位列表中,則執(zhí)行 muteRemoteAudio(userId, true),靜音該非法用戶音頻;
● onUserAudioAvailable(userId, true) 如果該用戶存在業(yè)務(wù)麥位列表中,則執(zhí)行 muteRemoteAudio(userId, false),正常播放該用戶音頻。
方法二:音量大小回調(diào)檢測(cè)幽靈麥
基本原理:通過 TRTC 音量大小回調(diào),比對(duì)當(dāng)前上行音頻用戶列表和業(yè)務(wù)側(cè)麥位狀態(tài)列表,從而識(shí)別出不在麥上卻有上行音頻的幽靈麥。當(dāng)檢測(cè)出幽靈麥后,客戶端本地執(zhí)行靜音該用戶的遠(yuǎn)端音頻流,同時(shí)上報(bào)到服務(wù)端,服務(wù)端決策是否將該用戶踢出房間。示例代碼如下:
// 啟用音量大小提示,可自定義回調(diào)間隔mTRTCCloud.enableAudioVolumeEvaluation(500);private class TRTCCloudImplListener extends TRTCCloudListener { // 每路音量大小的反饋回調(diào) public void onUserVoiceVolume(ArrayList userVolumes, int totalVolume) { super.onUserVoiceVolume(userVolumes, totalVolume); for (TRTCCloudDef.TRTCVolumeInfo speaker : userVolumes) { if (!speaker.userId.equals(mUserId) && speaker.volume > 0) { ... // 比對(duì)判斷當(dāng)前 speaker 是否在業(yè)務(wù)側(cè)麥上用戶列表中 // 若為否,判定當(dāng)前 speaker 為幽靈麥,執(zhí)行以下邏輯 ... count++; if (count >= 5) { // 增加容忍次數(shù)防止誤判 // 主動(dòng)靜音幽靈麥用戶 mTRTCCloud.muteRemoteAudio(speaker.userId, true); count = 0; ... // 上報(bào)幽靈麥用戶給服務(wù)端做相應(yīng)處理(踢人) ... } } } }}
3)踢出幽靈麥用戶
基本原理:通過TRTC后臺(tái)的移除用戶接口 RemoveUser,強(qiáng)行將幽靈麥用戶從房間內(nèi)踢出,并配合高級(jí)權(quán)限控制,從而確保該用戶無法再次進(jìn)入房間。
騰訊云實(shí)時(shí)音視頻遵從不同國(guó)家和行業(yè)的合規(guī)性要求,除了保證所提供服務(wù)的安全性、合規(guī)性、可用性、保密性和隱私性之外,還可以滿足企業(yè)及其客戶的多項(xiàng)合規(guī)監(jiān)管需求。騰訊云實(shí)時(shí)音視頻還擁有一套獨(dú)立完整的國(guó)際站點(diǎn),海外環(huán)境部署與國(guó)內(nèi)完全隔離,數(shù)據(jù)不會(huì)回傳國(guó)內(nèi),符合海外法律法規(guī)。此外,騰訊云也通過了70項(xiàng)全球權(quán)威認(rèn)證,例如ISO 27017/27018/27701/29151、CSA STAR、NIST CSF等。
本文主要介紹了語聊社交的常見場(chǎng)景與具體的實(shí)現(xiàn)方案,并且針對(duì)出??赡苡龅降奶魬?zhàn)及其解決方案進(jìn)行詳細(xì)分享,相信隨著國(guó)內(nèi)越來越多的公司出海,還會(huì)繼續(xù)遇到更多新的挑戰(zhàn),歡迎大家到評(píng)論區(qū)留言,一起討論。
標(biāo)簽: 實(shí)時(shí)音視頻 即時(shí)通信