封装组件:LNDanmakuPlayer

这个文章的前置文章是:LNDanmakuMaster

这个文档主要介绍LNDanmakuMaster中最重要的组件LNDanmakuPlayer;这个组件的代码量应该是整个框架中最多的,.m文件中包含了500行左右的代码;其他的主要组件通常都带有Abstract支持定义,但LNDanmakuPlayer没有,这意味着它是不可替代的。

LNDanmakuPlayer结构

LNDanmakuPlayer的责任与Controller类似,他不展示内容、也不更新数据;更多的时候他只是在发号施令(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等组件。
  • 实现了:clock、containerView、dispatcher的代理和数据源
  • 除此之外,还负责时钟信号一对多转发、播放状态维护、重复检查、吞吐量限制。(maxSmoothGrainNum)、弹幕回收等工作。
  • 作为LNDanmakuMaster的门面类,LNDanmakuPlayer需要向外界提供各种控制方法,为了划分这些方法的职责,我为其划分了类别,除默认类之外还包含:(Track)、(Data)、(Control)、(TrackGroup)、(Recover)五个类别,各个类别提供方法的用途见下面这个详细的表格。
类别名 作用
() 默认类别,定义使用到的其他组件,维护播放器状态。
(Track) 控制轨道的插入、移除。
(Data) 控制弹幕数据的插入、弹幕视图复用。
(Control) 控制Player播放状态包括:开始、暂停、恢复、结束四个基本控制方法;各个子组件的清空方法;针对单点弹幕的移除方法。
(TrackGroup) 轨道组专用类别,包括:插入、移除轨道组;向轨道组中插入弹幕。
(Recover) 恢复操作专用类别:LNDanmakuMaster支持视频seek后迅速恢复功能,恢复功能指视频从一个时间点切换至另一个时间点后,弹幕播放器也可以瞬间将展示的弹幕切换至对应时间点的状态,而不是清空后重新从右侧飘至中央(这个功能之后进行介绍)。

LNDanmakuPlayer工作方式

LNDanmakuPlayer实现的逻辑较多,这里描述一条普通的弹幕进入LNDanmakuPlayer中后经历的所有流程,来把Player和之前讲述的其他组件串在一起。

注意:以下所有名词均去掉LNDanmaku前缀;暂不考虑轨道组的情况;Player中使用的轨道是最常见的那种横向轨道。

阶段1:放置阶段

  • 我们得到了一个来自网络的弹幕模型,这个模型可能是使用http分段请求的,也可能是内嵌在音视频流中的,我们不关心来源,但我们确信他是一个NSObject类型的对象,称之为XXModel。
  • 一个专用的弹幕工厂为XXModel生产一个Attributes包装了这个XXModel,把XXModel放在customObj属性上,这个工厂是与业务相关的,所以他不在LNDanmakuMaster框架中。
  • 这个Attributes被释放到了Player中(通常视频播放进度会不断产生回调并释放那些可播放的弹幕)。
  • Player不会自行处理弹幕,将其转交给Dispatcher处理。
  • Dispatcher接收到Attributes后将Attributes放置到队尾,就是之前区分高低优先级的那条队列。

阶段2:更新阶段

  • 开启状态的Clock产生了下一段更新信号。
  • Player接收到更新信号后,拿到了信号中一小段“流逝的时间”,这个时间是距离上次clock发出信号的间隔,Player把这个信号和时间信息转发给自己的TrackControllers和Dispatcher(这个先后顺序是固定的)。
  • TrackController收到信号后更新了已有的轨道,在他们的存活时间中扣除了信号传来那段“流逝的时间”,并使用自己的track重新摆放了这些弹幕的位置。
  • Dispatcher收到信号后遍历了Player的轨道列表,并找到能放下自己队首弹幕的轨道,把队首的弹幕放到轨道上。
  • TrackController接收到弹幕后存储弹幕并将弹幕的presentView/presentLayer放置到ContainerView上,在之后的周期中像更新其他弹幕一样更新这条弹幕。

阶段3:卸载阶段

  • 在阶段2,TrackController更新时,会遇到那些存活时间超过了预定时间的弹幕。
  • TrackController调用ContainerView移除弹幕,并将其从自己的存储结构中移除,并代理给Player一个卸载回调。
  • Player收到轨道控制器的卸载回调后,走回收逻辑,将Attributes的presentLayer/presentView存入Pool中,释放Attributes。

除TrackController卸载回调外,dispatcher的溢出丢弃、手动移除等时机也会进行Attributes回收。

总结

LNDanmakuPlayer是这个框架的门面类,封装其他组件并对外提供调用方法和时机代理;在构建好一个Player后,弹幕相关的全部操作都可以通过操作Player完成,不必与内部的其他组件交互。

结束语

至此,LNDanmakuMaster这个框架的全部组件已经介绍完了,除了基础文档中介绍的这些组件外,LNDanmakuMaster有一些额外策略或动画的实现:分布策略的计算、pop的动画、吞吐量控制策略等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342