封裝組件:LNDanmakuPlayer

這個文章的前置文章是:LNDanmakuMaster

這個文檔主要介紹LNDanmakuMaster中最重要的組件LNDanmakuPlayer式撼;這個組件的代碼量應(yīng)該是整個框架中最多的荐健,.m文件中包含了500行左右的代碼痕鳍;其他的主要組件通常都帶有Abstract支持定義爬早,但LNDanmakuPlayer沒有番捂,這意味著它是不可替代的账锹。

LNDanmakuPlayer結(jié)構(gòu)

LNDanmakuPlayer的責任與Controller類似哪轿,他不展示內(nèi)容窑业、也不更新數(shù)據(jù);更多的時候他只是在發(fā)號施令(ps:核心人物自己一般不會親自動手):

@interface LNDanmakuPlayer ()
<
LNDanmakuClockDelegate,
LNDanmakuContrainerViewDelegate,
LNDanmakuAbstractDispatcherDelegate,
LNDanmakuAbstractDispatcherSmoothGrainDataSource
>
@property (nonatomic, strong) LNDanmakuClock *clock;
@property (nonatomic, strong) LNDanmakuContainerView *containerView;
@property (nonatomic, strong) NSMutableArray<LNDanmakuAbstractTrackController *> *trackControllerMArr;
@property (nonatomic, strong) LNDanmakuDispatcher *dispatcher;
@property (nonatomic, strong) NSMutableArray <id<LNDanmakuClockDelegate>> *clockDelegateMArr;
@property (nonatomic, assign) LNDanmakuPlayerStatus status;
@property (nonatomic, strong) LNDanmakuPool *layerPool;
@property (nonatomic, strong) LNDanmakuPool *viewPool;
@property (nonatomic, strong) NSMutableArray <LNDanmakuTrackGroup *> *trackGroupMArr;
@property (nonatomic, strong) NSMutableSet <LNDanmakuAbstractTrackController *> *trackControllerNoRepeatMSet;
@property (nonatomic, assign) NSInteger maxSmoothGrainNum;
@property (nonatomic, assign) NSInteger restSmoothGrainNum;
@end

LNDanmakuPlayer工作涵蓋的范圍:

  • 包含了:clock困后、containerView乐纸、@[trackController]、Pool摇予、trackGroup等組件汽绢。
  • 實現(xiàn)了:clock、containerView侧戴、dispatcher的代理和數(shù)據(jù)源
  • 除此之外宁昭,還負責時鐘信號一對多轉(zhuǎn)發(fā)、播放狀態(tài)維護酗宋、重復檢查积仗、吞吐量限制。(maxSmoothGrainNum)蜕猫、彈幕回收等工作寂曹。
  • 作為LNDanmakuMaster的門面類,LNDanmakuPlayer需要向外界提供各種控制方法回右,為了劃分這些方法的職責稀颁,我為其劃分了類別,除默認類之外還包含:(Track)楣黍、(Data)匾灶、(Control)、(TrackGroup)租漂、(Recover)五個類別阶女,各個類別提供方法的用途見下面這個詳細的表格颊糜。
類別名 作用
() 默認類別,定義使用到的其他組件秃踩,維護播放器狀態(tài)衬鱼。
(Track) 控制軌道的插入、移除憔杨。
(Data) 控制彈幕數(shù)據(jù)的插入鸟赫、彈幕視圖復用。
(Control) 控制Player播放狀態(tài)包括:開始消别、暫停抛蚤、恢復、結(jié)束四個基本控制方法寻狂;各個子組件的清空方法岁经;針對單點彈幕的移除方法。
(TrackGroup) 軌道組專用類別蛇券,包括:插入缀壤、移除軌道組;向軌道組中插入彈幕纠亚。
(Recover) 恢復操作專用類別:LNDanmakuMaster支持視頻seek后迅速恢復功能塘慕,恢復功能指視頻從一個時間點切換至另一個時間點后,彈幕播放器也可以瞬間將展示的彈幕切換至對應(yīng)時間點的狀態(tài)蒂胞,而不是清空后重新從右側(cè)飄至中央(這個功能之后進行介紹)图呢。

LNDanmakuPlayer工作方式

LNDanmakuPlayer實現(xiàn)的邏輯較多,這里描述一條普通的彈幕進入LNDanmakuPlayer中后經(jīng)歷的所有流程啤誊,來把Player和之前講述的其他組件串在一起岳瞭。

注意:以下所有名詞均去掉LNDanmaku前綴拥娄;暫不考慮軌道組的情況蚊锹;Player中使用的軌道是最常見的那種橫向軌道。

階段1:放置階段

  • 我們得到了一個來自網(wǎng)絡(luò)的彈幕模型稚瘾,這個模型可能是使用http分段請求的牡昆,也可能是內(nèi)嵌在音視頻流中的,我們不關(guān)心來源摊欠,但我們確信他是一個NSObject類型的對象丢烘,稱之為XXModel。
  • 一個專用的彈幕工廠為XXModel生產(chǎn)一個Attributes包裝了這個XXModel些椒,把XXModel放在customObj屬性上播瞳,這個工廠是與業(yè)務(wù)相關(guān)的,所以他不在LNDanmakuMaster框架中免糕。
  • 這個Attributes被釋放到了Player中(通常視頻播放進度會不斷產(chǎn)生回調(diào)并釋放那些可播放的彈幕)赢乓。
  • Player不會自行處理彈幕忧侧,將其轉(zhuǎn)交給Dispatcher處理。
  • Dispatcher接收到Attributes后將Attributes放置到隊尾牌芋,就是之前區(qū)分高低優(yōu)先級的那條隊列蚓炬。

階段2:更新階段

  • 開啟狀態(tài)的Clock產(chǎn)生了下一段更新信號。
  • Player接收到更新信號后躺屁,拿到了信號中一小段“流逝的時間”肯夏,這個時間是距離上次clock發(fā)出信號的間隔,Player把這個信號和時間信息轉(zhuǎn)發(fā)給自己的TrackControllers和Dispatcher(這個先后順序是固定的)犀暑。
  • TrackController收到信號后更新了已有的軌道驯击,在他們的存活時間中扣除了信號傳來那段“流逝的時間”,并使用自己的track重新擺放了這些彈幕的位置母怜。
  • Dispatcher收到信號后遍歷了Player的軌道列表余耽,并找到能放下自己隊首彈幕的軌道,把隊首的彈幕放到軌道上苹熏。
  • TrackController接收到彈幕后存儲彈幕并將彈幕的presentView/presentLayer放置到ContainerView上碟贾,在之后的周期中像更新其他彈幕一樣更新這條彈幕。

階段3:卸載階段

  • 在階段2轨域,TrackController更新時袱耽,會遇到那些存活時間超過了預定時間的彈幕。
  • TrackController調(diào)用ContainerView移除彈幕干发,并將其從自己的存儲結(jié)構(gòu)中移除朱巨,并代理給Player一個卸載回調(diào)。
  • Player收到軌道控制器的卸載回調(diào)后枉长,走回收邏輯冀续,將Attributes的presentLayer/presentView存入Pool中,釋放Attributes必峰。

除TrackController卸載回調(diào)外洪唐,dispatcher的溢出丟棄、手動移除等時機也會進行Attributes回收吼蚁。

總結(jié)

LNDanmakuPlayer是這個框架的門面類凭需,封裝其他組件并對外提供調(diào)用方法和時機代理;在構(gòu)建好一個Player后肝匆,彈幕相關(guān)的全部操作都可以通過操作Player完成粒蜈,不必與內(nèi)部的其他組件交互。

結(jié)束語

至此旗国,LNDanmakuMaster這個框架的全部組件已經(jīng)介紹完了枯怖,除了基礎(chǔ)文檔中介紹的這些組件外,LNDanmakuMaster有一些額外策略或動畫的實現(xiàn):分布策略的計算能曾、pop的動畫度硝、吞吐量控制策略等设捐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市塘淑,隨后出現(xiàn)的幾起案子萝招,更是在濱河造成了極大的恐慌,老刑警劉巖存捺,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槐沼,死亡現(xiàn)場離奇詭異,居然都是意外死亡捌治,警方通過查閱死者的電腦和手機岗钩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肖油,“玉大人兼吓,你說我怎么就攤上這事∩梗” “怎么了视搏?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長县袱。 經(jīng)常有香客問我浑娜,道長,這世上最難降的妖魔是什么式散? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任筋遭,我火速辦了婚禮,結(jié)果婚禮上暴拄,老公的妹妹穿的比我還像新娘漓滔。我一直安慰自己,他們只是感情好乖篷,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布响驴。 她就那樣靜靜地躺著,像睡著了一般那伐。 火紅的嫁衣襯著肌膚如雪踏施。 梳的紋絲不亂的頭發(fā)上石蔗,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天罕邀,我揣著相機與錄音,去河邊找鬼养距。 笑死诉探,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棍厌。 我是一名探鬼主播肾胯,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼竖席,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬肚?” 一聲冷哼從身側(cè)響起毕荐,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎艳馒,沒想到半個月后憎亚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡弄慰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年第美,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陆爽。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡什往,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慌闭,到底是詐尸還是另有隱情别威,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布驴剔,位于F島的核電站兔港,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仔拟。R本人自食惡果不足惜衫樊,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望利花。 院中可真熱鬧科侈,春花似錦、人聲如沸炒事。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挠乳。三九已至权薯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睡扬,已是汗流浹背盟蚣。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卖怜,地道東北人屎开。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像马靠,于是被迫代替她去往敵國和親奄抽。 傳聞我的和親對象是個殘疾皇子蔼两,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359