女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

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

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

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

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

jf_78858299 ? 來源:網(wǎng)易云音樂技術(shù)團隊 ? 作者:AirLand ? 2023-05-26 16:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

由于所有的 Player 都有這個邏輯因此可以將這部分再抽象成一個 AbsPlayer:

abstract class AbsPlayerIDataSource, CB : ICallback>
    : IPlayer

最后整個 Player 的類圖如下所示:

圖片

image.png

這里我們不關(guān)注 Player 的功能具體是如何實現(xiàn)的,比如如何推流,如何拉流,如何進行 RTC 等。畢竟每個項目底層所用的服務(wù)商 sdk 各不相同,技術(shù)實現(xiàn)也不同,因此這里我們只從架構(gòu)的層面去探討。

2、Player 的切換

Player 的切換針對的就是部分場景 RTC,這里我們引入 SwitchablePlayer 的概念專門用于此種場景,而其本身也繼承自 AbsPlayer, 具備 Player 的所有功能。只不過這些功能是通過裝飾者模式由其內(nèi)部真正的 Player 來實現(xiàn),同時增加了 Switch 的能力。再講到 Switch 能力之前先來思考幾個問題。

  1. 何時觸發(fā) Switch?
  2. 如何進行 Switch?
  3. Switch 的目標對象 Player 從何而來?

第一個問題何時觸發(fā) Switch :我們知道只要觸發(fā) Switch 就意味著需要啟動另外的 Player,而啟動 Player 又需要上面提到的 IDataSource,因此我們只需要判斷啟動 Player 所傳入的 IDataSource 類型和當(dāng)前 Player 的 IDataSource 類型是否相同,如果不同便可觸發(fā)。判斷的具體邏輯是對比當(dāng)前 Player 泛型參數(shù)的 IDataSource 類型( AbsPlayer第一個范型參數(shù) )和傳入的 IDataSource 類型來實現(xiàn)。

private fun isSourceMatch(
        player: AbsPlayer<IDataSource, ICallback>?,
        ds: IDataSource
    ): Boolean {
        if (player == null) {
            return false
        } else {
            val clazz = player::class.java
            var type = getGenericSuperclass(clazz) ?: return false
            while (Types.getRawType(type) != AbsPlayer::class.java) {
                type = getGenericSuperclass(type) ?: return false
            }
            return if (type is ParameterizedType) {
                val args = type.actualTypeArguments
                if (args.isNullOrEmpty()) {
                    false
                } else {
                    Types.getRawType(args[0]).isInstance(ds) && isSameSource(player, ds)
                }
            } else {
                false
            }
        }
    }

第二個問題如何進行 Switch :這個就比較簡單了只需要停止掉當(dāng)前的 Player 再啟動目標 Player 即可。

第三個問題 Switch 的目標對象 Player 從何而來 :SwitchablePlayer 并不清楚業(yè)務(wù)需要哪些 Player ,只是對 Player 功能的一層包裝以及維護 Switch 功能,因此具體的 Player 創(chuàng)建需要由業(yè)務(wù)層來實現(xiàn), SwitchablePlayer 只提供一個獲取 Player 的抽象方法例如:

abstract fun getPlayer(ds: IDataSource): AbsPlayer<out IDataSource, out ICallback>?

另外由于進行 Switch 的時候會停止掉當(dāng)前的 Player,而被停止的 Player 是否能復(fù)用,如果能復(fù)用則可以將其緩存起來,下次使用優(yōu)先從緩存中獲得。整個SwitchablePlayer對應(yīng)的流程如圖所示:

圖片

image.png

在使用時調(diào)用者可以根據(jù)自己的業(yè)務(wù)定義相關(guān) Player,例如在直播-> PK 的業(yè)務(wù)中,涉及到兩個 Player 的切換即:LivePlayer 和 PKPlayer

class LivePKSwitchablePlayer : SwitchablePlayer(false) {
        override fun getPlayer(ds: IDataSource): AbsPlayer<out IDataSource, out ICallback> {
            return when (ds) {
                is LiveDataSource -> {
                    LivePlayer()
                }
                is PKDataSource -> {
                    PKPlayer()
                }
                else -> LivePlayer()
            }
        }

    }
3、流程封裝

對于整個 RTC 流程的封裝需要搞清楚兩件事情:

  1. RTC 的主體流程是怎樣的
  2. 業(yè)務(wù)調(diào)用方需要的是什么,關(guān)注的又是什么

由于 RTC 的主體流程和日常打電話相似,所以筆者以此類比,這樣大家更容易理解。下圖所示即為整個通話過程。圖片

搞清楚整個流程后,接下來就是搞清楚第二件事情,業(yè)務(wù)調(diào)用方需要的是什么,關(guān)注的又是什么。結(jié)合上圖來看關(guān)注的大概有三點:

  • 第一就是需要具備撥打和掛斷的入口;( Player 的 Start 和 Stop
  • 第二就是要能知道當(dāng)前的通話狀態(tài)比如是否正在連通,是否已經(jīng)接通,是否通話結(jié)束;( Player 的 狀態(tài)維護
  • 第三就是一些反饋比如對方未接通,對方不在服務(wù)區(qū),手機號是空號等。( Player 的 核心事件回調(diào)即之前提到的 ICallback

而至于它是如何連通的,底層做了哪些操作,撥打電話的人對此毫不關(guān)心。基于上述我們的整體功能設(shè)計所要關(guān)注的點就有了。

1、通過設(shè)計一個 manager 來管理 Player 并對外暴露 Start 和 Stop 方法。

2、對 Player 進行狀態(tài)維護,并讓其狀態(tài)可被上層監(jiān)聽。

3、Player 的一些核心事件回調(diào)也可被上層監(jiān)聽。

其中第一點和第三點比較簡單,這里就不做過多的贅述。第二點狀態(tài)維護,筆者使用了 StateMachine 狀態(tài)機來實現(xiàn),在不同的狀態(tài)執(zhí)行不同的操作,同時每一種狀態(tài)都對應(yīng)一個狀態(tài)碼,上層可以通過監(jiān)聽狀態(tài)碼來感知狀態(tài)變化。

圖片

image.png

狀態(tài)碼和核心事件的設(shè)置這里使用了 LiveData 去處理

class RtcHolder : IRtcHolder {
    private val _rtcState = MutableLiveData(RtcStatus.IDLE)
    private val _rtcEvent = MutableLiveData(RtcEvent.IDLE)
    val rtcState = _rtcState.distinctUntilChanged()
    val rtcEvent = _rtcEvent.distinctUntilChanged()
    private val callBack = object : IRtcCallBack {
        override fun onCurrentStateChange(stateCode: Int) {
            _rtcState.value = stateCode
        }

        override fun onEvent(eventCode: Int) {
            _rtcEvent.value = eventCode
        }
       
       //......省略其他代碼
        
    }

     init {
        //上層狀態(tài)監(jiān)聽 
        rtcState.observeForever {
            when (it) {
                RtcStatus.CONNECT_END -> {
                    ToastHelper.showToast("通話結(jié)束")
                }
            }
        }
    }
    //......省略其他代碼
}

到這里整個腳手架的方案設(shè)計就結(jié)束了,其中服務(wù)商 SDK 封裝部分以及監(jiān)控部分,筆者準備放到下期再來講解。

總結(jié)

本文介紹了 RTC 腳手架產(chǎn)生的背景,并以通俗易懂的方式一步步闡述設(shè)計過程以及最終實現(xiàn)。在此期間發(fā)現(xiàn)問題,解決問題,引出思考。由于受限于篇幅,不能將每一個點都進行詳盡的介紹,有興趣的同學(xué)如有疑問,可以留言,一起探討學(xué)習(xí)。

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

    關(guān)注

    2

    文章

    619

    瀏覽量

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

    關(guān)注

    0

    文章

    221

    瀏覽量

    17079
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

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

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

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

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

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

    懸挑式腳手架一般有兩種:一種是每層一挑,將立桿底部頂在樓板、梁或墻體等建筑部位,向外傾斜固定后,在其上部搭設(shè)橫桿、鋪腳手板形成施工層,施工一個層高,待轉(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ān)心的事情。超重載荷對立柱施加的壓力過大可能會導(dǎo)致結(jié)構(gòu)崩塌。平板下面的物聯(lián)網(wǎng)傳感器可以在壓力成為問題之前測量到它。
    發(fā)表于 03-20 10:16 ?667次閱讀

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

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

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

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

    腳手架掛牌一般在哪些情況使用比較好

    在工業(yè)化生產(chǎn)的過程中,為了更好地保證生產(chǎn)安全,也是有一些情況必須應(yīng)用到腳手架掛牌的,那麼它會在哪些的情況開展應(yīng)用呢?最先便是在機器檢修之時必須開展應(yīng)用。由于在對機器檢修的情況,不
    發(fā)表于 02-01 14:43 ?1227次閱讀

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

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

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

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

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

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

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

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

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

    RTC即 Real-Time Communication 的簡稱是一種給行業(yè)提供高并發(fā)、低延時、高清流暢、安全可靠的全場景、全互動、全實時的音視頻服務(wù)的終端服務(wù)。上面是比較官方的解釋,通俗的來講就是
    的頭像 發(fā)表于 05-26 16:48 ?879次閱讀
    <b class='flag-5'>RTC</b><b class='flag-5'>腳手架</b>的設(shè)計與<b class='flag-5'>實現(xiàn)</b>(上)
    主站蜘蛛池模板: 自贡市| 凉城县| 平塘县| 博兴县| 乌苏市| 大余县| 宜兴市| 金阳县| 古浪县| 广汉市| 黔南| 都昌县| 城步| 惠水县| 镇沅| 定安县| 巴楚县| 上林县| 同心县| 临邑县| 米脂县| 南投县| 高邑县| 宜兴市| 深水埗区| 金山区| 同江市| 宁国市| 四川省| 通海县| 景谷| 蓬安县| 丹巴县| 徐汇区| 乌拉特中旗| 织金县| 邻水| 双辽市| 新昌县| 万安县| 页游|