0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTC腳手架的設(shè)計(jì)與實(shí)現(xiàn)(上)

jf_78858299 ? 來源:網(wǎng)易云音樂技術(shù)團(tuán)隊(duì) ? 作者:AirLand ? 2023-05-26 16:48 ? 次閱讀

什么是 RTC?

RTC 即 Real-Time Communication 的簡(jiǎn)稱是一種給行業(yè)提供高并發(fā)、低延時(shí)、高清流暢、安全可靠的全場(chǎng)景、全互動(dòng)、全實(shí)時(shí)的音視頻服務(wù)的終端服務(wù)。上面是比較官方的解釋,通俗的來講就是一種能夠?qū)崿F(xiàn)一對(duì)一、多對(duì)多音視頻通話等眾多功能的服務(wù)。目前提供該項(xiàng)服務(wù)的服務(wù)商有很多例如:聲網(wǎng)、云信、火山引擎、騰訊云等。

背景

目前云音樂旗下 APP 眾多,其中涉及到 RTC 業(yè)務(wù)的不在少數(shù),例如:常見的音視頻連麥、PK、派對(duì)房,1v1 聊天等。由于業(yè)務(wù)線不同,功能不同,開發(fā)者也不同,大家各寫一套,不斷的重復(fù)造輪子,因此為了避免重復(fù)的開發(fā)工作提升開發(fā)效率,需要有一套通用的RTC框架。

設(shè)計(jì)思路

在講具體的方案設(shè)計(jì)之前,先講一下我的設(shè)計(jì)思路:

  1. 功能內(nèi)聚 :需要將功能都封裝在一個(gè)容器里,對(duì)外通過接口提供方法調(diào)用
  2. 業(yè)務(wù)隔離 :不同的業(yè)務(wù)需要有不同的功能容器
  3. 統(tǒng)一調(diào)用 :所有功能容器需要有統(tǒng)一的調(diào)用入口
  4. 狀態(tài)維護(hù) :需要對(duì)狀態(tài)進(jìn)行精準(zhǔn)維護(hù)
  5. 切換無感 :進(jìn)行功能容器切換時(shí)候,無感知
  6. 核心可控 :對(duì)核心鏈路可監(jiān)控,故障預(yù)警

基于以上 6 點(diǎn),大致的架構(gòu)設(shè)計(jì)如圖所示,這里先不用深究圖中的模塊表示什么,后面會(huì)講到,這里只是先了解一下大致的架構(gòu):

圖片

image.png

接下來我就來講講具體的實(shí)現(xiàn)過程。

方案設(shè)計(jì)

前言:

RTC 的業(yè)務(wù)場(chǎng)景雖然很多,但本質(zhì)上卻相差無幾,都是用戶加入到一個(gè)共同的房間,然后在房間內(nèi)進(jìn)行實(shí)時(shí)的音視頻通訊。具體到實(shí)際項(xiàng)目中大致又可分為兩種:全場(chǎng)景 RTC 和部分場(chǎng)景 RTC。

  • 全場(chǎng)景 RTC :整個(gè)業(yè)務(wù)都是通過 RTC 技術(shù)實(shí)現(xiàn)例如:1v1 音視頻通話、派對(duì)房等。
  • 部分場(chǎng)景 RTC :即整個(gè)業(yè)務(wù)鏈路中只有一部分使用了 RTC 技術(shù),往往這種業(yè)務(wù)會(huì)涉及到引擎的切換。

不管是哪一種場(chǎng)景,承載核心功能的引擎都是必不可少的,因此我們首先就從引擎開始著手,另外為了方便描述,后續(xù)便將引擎統(tǒng)一稱作 Player。

1、Player 的封裝

在與 RTC 相關(guān)聯(lián)的業(yè)務(wù)中會(huì)涉及到不同類型的 Player,例如:主播開播(推流 Player),觀眾觀看直播(拉流 Player)以及 RTC Player等。它們的功能雖然各不相同,但用法卻有相似之處,例如都有啟動(dòng) start,終止 stop 等。因此我們可以將不同的 Player 抽象出一個(gè)共同的接口 IPlayer 相關(guān)代碼如下:

interface IPlayer<DS : IDataSource, CB : ICallback> {
    fun start(ds: DS)

    fun stop()

    fun  setParam(key: String, value: T?)

    ......
}

其中 IDataSourceICallback 分別是啟動(dòng) Player 所需要的數(shù)據(jù)源和回調(diào),后面的文章中也會(huì)多次提到,特別是 IDataSource 它是 Player 啟動(dòng)的源頭就好比打電話時(shí)的電話號(hào)碼。

在這里遇到的一個(gè)問題點(diǎn)就是由于 Player 內(nèi)聚了所有的功能除了有一些通用方法外,也有著屬于自己特有的方法,例如:靜音,音量調(diào)節(jié)等。這些方法眾多而且各不相同無法在 IPlayer 接口中全部列出,即使能全部列出,但隨著業(yè)務(wù)的迭代 Player 中的方法肯定會(huì)不斷變化,不可能每更改一個(gè)方法就改一下接口,這顯然不符合程序設(shè)計(jì)原則。那么如何將不同的方法抽象化,讓上層通過調(diào)用同一個(gè)方法來執(zhí)行不同的操作呢?這里通過:

fun  setParam(key: String, value: T?)

來實(shí)現(xiàn),其中 key 表示方法的唯一標(biāo)記,value 表示方法的入?yún)?。這樣上層只需要通過調(diào)用 setParam 傳入相應(yīng)的方法標(biāo)記和方法入?yún)⒓纯烧{(diào)用到對(duì)應(yīng)的方法了。那么如何做到呢?答案也很簡(jiǎn)單通過一個(gè)中間層建立起一一映射關(guān)系。但是 Player 的類型眾多,要是每寫一個(gè) Player 都要寫一個(gè)映射邏輯就太麻煩了。所以這里通過 APT 編譯時(shí)注解再結(jié)合 javapoet 自動(dòng)生成這個(gè)中間層并給它命名為 xxxPlayerWrapper 其內(nèi)部生成一個(gè) convert 方法,在這個(gè)方法內(nèi)部完成一一映射邏輯。接下來我們看看具體實(shí)現(xiàn)過程:

  1. 首先定義了兩個(gè)注解分別作用于具體的 Player 和對(duì)應(yīng)的方法例如:
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE})
public @interface PlayerClass {
}

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD})
public @interface PlayerMethod {
    String name();
}

@PlayerClass
open class xxxPlayer : IPlayer<xxxDataSource, xxxCallback>() {

    @PlayerMethod(name = "key1")
    fun method1(v: String) {
        ....具體實(shí)現(xiàn)
    }
}
  1. 一一映射關(guān)系建立:

xxxPlayer 和 xxxPlayerWrapper 之間是一個(gè)相互依賴關(guān)系,互為彼此的成員變量。當(dāng)調(diào)用 xxxPlayer 的接口方法 setParam(key: String, value: T?) 時(shí),會(huì)直接調(diào)用到 xxxPlayerWrapper 的 convert 方法,convert 方法會(huì)根據(jù) key 來找到其所對(duì)應(yīng)的方法名,最后直接調(diào)用到 Player 的具體方法。

圖片

image.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RTC
    RTC
    +關(guān)注

    關(guān)注

    2

    文章

    511

    瀏覽量

    65897
  • 騰訊云
    +關(guān)注

    關(guān)注

    0

    文章

    204

    瀏覽量

    16704
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用愛星物聯(lián)服務(wù)腳手架實(shí)現(xiàn)定制服務(wù)

    和相關(guān)工具,可能理解起來還是云里霧里,還是沒法下手定制開發(fā)吧? 別急,理論指導(dǎo)實(shí)踐來了。 本文介紹基于API腳手架和微服務(wù)腳手架構(gòu)建自定義的對(duì)應(yīng)服務(wù),以及自定義服務(wù)怎么與愛星物聯(lián)IoT平臺(tái)服務(wù)進(jìn)行交互 (內(nèi)容屬于下圖紅色線框部
    的頭像 發(fā)表于 06-07 09:38 ?1801次閱讀
    利用愛星物聯(lián)服務(wù)<b class='flag-5'>腳手架</b><b class='flag-5'>實(shí)現(xiàn)</b>定制服務(wù)

    2010年迪拜五大行業(yè)展|迪拜建材展|緊固件|腳手架|建筑五金|衛(wèi)浴|陶瓷|大理石

    ;建筑安全設(shè)備;混凝土-預(yù)制、建筑系統(tǒng);建筑立面、盤座面及包覆;加熱裝置;模板/百葉窗;工具-空氣、手動(dòng)及電動(dòng);砌體-磚、預(yù)制、水泥、灰漿;螺帽、錨桿、螺絲、鉸鏈等;建筑拆除;木材-框架及結(jié)構(gòu);腳手架
    發(fā)表于 09-06 15:51

    2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|

    |吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗
    發(fā)表于 09-06 15:55

    2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|

    ;nbsp;2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展|緊固件|腳手架|玻璃|門窗|2011年沙特建材展|吉達(dá)建材展|五大行業(yè)展
    發(fā)表于 09-06 16:05

    懸挑式腳手架監(jiān)理控制要點(diǎn)

    懸挑式腳手架一般有兩種:一種是每層一挑,將立桿底部頂在樓板、梁或墻體等建筑部位,向外傾斜固定后,在其上部搭設(shè)橫桿、鋪腳手板形成施工層,施工一個(gè)層高,待轉(zhuǎn)入上層
    發(fā)表于 12-15 14:29 ?15次下載

    腳手架的避雷方法

    搭設(shè)在曠野山坡雷擊區(qū)的鋼腳手架在雷雨季節(jié)應(yīng)設(shè)避雷裝置,避雷裝置包括接閃器、接地極、接地線。
    發(fā)表于 01-19 15:26 ?18次下載

    物聯(lián)網(wǎng)腳手架系統(tǒng)能帶來什么益處

    橫向移動(dòng)不是腳手架上工人唯一需要擔(dān)心的事情。超重載荷對(duì)立柱施加的壓力過大可能會(huì)導(dǎo)致結(jié)構(gòu)崩塌。平板下面的物聯(lián)網(wǎng)傳感器可以在壓力成為問題之前測(cè)量到它。
    發(fā)表于 03-20 10:16 ?553次閱讀

    科學(xué)家研發(fā)可溶解的植入骨折的腳手架材料——特殊繃帶

    植入骨折的腳手架材料,能夠促使身體自身的骨細(xì)胞長(zhǎng)入其中并治愈骨折。而現(xiàn)在,科學(xué)家們開發(fā)了一種特殊的繃帶,也可以做到這一點(diǎn)。
    的頭像 發(fā)表于 09-25 11:30 ?1658次閱讀

    腳手架掛牌方案需要符合哪些層面的規(guī)定

    腳手架掛牌的過程中,當(dāng)然就必須應(yīng)用到方案,即然是方案,又和生產(chǎn)安全有關(guān),也就必須讓它符合各個(gè)方面的規(guī)定,那麼必須讓這類方案符合哪些層面的規(guī)定呢? 最先就必須讓它符合機(jī)器設(shè)備構(gòu)造的規(guī)定,由于生產(chǎn)線
    發(fā)表于 02-11 10:52 ?1313次閱讀

    關(guān)于針對(duì)腳手架掛牌的歸納分析

    描述:用五金鎖具鎖定防護(hù)設(shè)備來防止很多人 隨便操作過程安全防護(hù)的能量源或者機(jī)器設(shè)備,(腳手架掛牌)直到維修結(jié)束,五金鎖具消除。 :運(yùn)用衣服標(biāo)簽來警告別人早就被安全防護(hù)的能量源或者機(jī)器設(shè)備不能隨便
    發(fā)表于 03-01 11:50 ?707次閱讀

    為何需要腳手架掛牌,它的作用是怎樣的

    腳手架掛牌是便于避免員工在進(jìn)行維修、維修保養(yǎng)時(shí),遇到來自設(shè)備的發(fā)生意外啟動(dòng)、出現(xiàn)異常啟動(dòng)、動(dòng)力裝置釋放出所導(dǎo)致的風(fēng)險(xiǎn)性,以保證 員工的人身安全。進(jìn)行腳手架掛牌操作程序的根本所在,斷掉設(shè)備與動(dòng)力裝置
    發(fā)表于 03-05 11:39 ?1884次閱讀

    腳手架掛牌的具體流程是怎樣的

    第一步:提前準(zhǔn)備工作? 提前準(zhǔn)備關(guān)閉能源。(腳手架掛牌)普遍的能源種類有(電磁能,機(jī)械動(dòng)能,空氣能熱水器等......)和它的潛在性風(fēng)險(xiǎn)。放好防護(hù)維護(hù)裝置(安全鎖具),并提前準(zhǔn)備關(guān)閉能源 第二步
    發(fā)表于 03-08 10:35 ?1422次閱讀

    腳手架掛牌是什么,有什么作用

    上邊的案例,看了后耐人尋味。有誤實(shí)際操作腳手架掛牌,導(dǎo)致這么多可憐生命的身亡和資產(chǎn)的損害。由此可見恰當(dāng)應(yīng)用安全鎖具,是一件多么的關(guān)鍵的事兒。溫州市博士安全用品 解釋一下什么叫腳手架掛牌?
    發(fā)表于 03-22 10:27 ?1980次閱讀

    關(guān)于腳手架掛牌的有關(guān)定義表述

    對(duì)一個(gè)斷開電源或是能源斷開設(shè)備鎖上,(腳手架掛牌)以防別人接入電源或能源(如開啟閘閥) 的一種安全防范措施,或稱鎖上。 標(biāo)識(shí)tagout 在一個(gè)斷開電源或能源的斷開設(shè)備掛上相對(duì)的警告或警示牌(如
    發(fā)表于 03-26 16:08 ?790次閱讀

    RTC腳手架的設(shè)計(jì)與實(shí)現(xiàn)(下)

    RTC即 Real-Time Communication 的簡(jiǎn)稱是一種給行業(yè)提供高并發(fā)、低延時(shí)、高清流暢、安全可靠的全場(chǎng)景、全互動(dòng)、全實(shí)時(shí)的音視頻服務(wù)的終端服務(wù)。上面是比較官方的解釋,通俗的來講就是
    的頭像 發(fā)表于 05-26 16:48 ?578次閱讀
    <b class='flag-5'>RTC</b><b class='flag-5'>腳手架</b>的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>(下)