소스 검색

更新demo案例

杨充 4 년 전
부모
커밋
963a59ef1e
1개의 변경된 파일33개의 추가작업 그리고 13개의 파일을 삭제
  1. 33 13
      read/04.视频播放器封装思路.md

+ 33 - 13
read/04.视频播放器封装思路.md

@@ -1,4 +1,4 @@
-# 04.视频播放器封装思路
+# 04.视频播放器通用架构实践
 #### 目录介绍
 - 01.视频播放器的痛点
 - 02.业务需求的目标
@@ -20,6 +20,9 @@
 - 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要支持播放器UI高度定制,而不是该lib库中UI代码
 - 针对视频播放,音频播放,播放回放,以及视频直播的功能。使用简单,代码拓展性强,封装性好,主要是和业务彻底解耦,暴露接口监听给开发者处理业务具体逻辑
 - 该播放器整体架构:播放器内核(自由切换) +  视频播放器 + 边播边缓存 + 高度定制播放器UI视图层
+- 项目地址:https://github.com/yangchong211/YCVideoPlayer
+- 关于视频播放器整体功能介绍文档:https://juejin.im/post/6883457444752654343
+- 关于视频播放器通用架构实践:
 - ![image](https://img-blog.csdnimg.cn/20201016173604612.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 
 
@@ -34,6 +37,8 @@
     - 有时候难以适应新的场景,比如添加一个播放广告,老师开课,或者视频引导业务需求,则需要到播放器中写一堆业务代码。迭代到后期,违背了开闭原则,视频播放器需要做到和业务分离
 - 视频播放器结构不清晰
     - 这个是指该视频播放器能否看了文档后快速上手,知道封装的大概流程。方便后期他人修改和维护,因此需要将视频播放器功能分离。比如切换内核+视频播放器(player+controller+view)
+- 播放器播放和业务耦合
+    - 比如多个app共用一个视频播放器组件,一个播放业务播放器状态发生变化,其他播放业务必须同步更新播放状态,各个播放业务之间互相交叉,随着播放业务的增多,开发和维护成本会急剧增加, 导致后续开发不可持续。
 
 
 
@@ -54,20 +59,33 @@
     - 播放器player与视频UI解耦:支持添加自定义视频视图,比如支持添加自定义广告,新手引导,或者视频播放异常等视图,这个需要较强的拓展性
 - 适合多种业务场景
     - 比如适合播放单个视频,多个视频,以及列表视频,或者类似抖音那种一个页面一个视频,还有小窗口播放视频。也就是适合大多数业务场景
-- 播放器的整体架构
+- 播放器的整体层级
     - ![image](https://img-blog.csdnimg.cn/20201012215233584.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+- 播放器架构的介绍
+    - 基础内核播放库:提供基础的播放功能,可以自由切换内核,也方便拓展添加其他sdk内核播放器
+    - 统一播放器:屏蔽底层内核播放器播放差异,根据协议为上层提供统一的播放能力接口,供上层调用
+    - 播放视图层:负责播放器视图层的UI控制和调度,彻底解除播放业务与播放器的耦合
+    - 播放场景业务:负责向用户展示音视频播放能力和交互的业务
+    - 播放关联业务: 为播放器提供增值或支撑的业务,比如视频埋点统计,后期添加投屏,后期添加下载功能
+    - demo:提供各种播放场景案例代码,基本上有大多数常用播放器的使用场景,建议直接看demo拿来即用
 
 
 
 ### 04.播放器内核封装
-#### 4.1 视频播放器内核封装需求
+#### 4.0 遇到的问题
+- 播放器内核拓展难
+    - 不同的播放SDK提供的API都不一样,如果业务层对每个合作方都进行业务开发,就会导致业务量非常庞大,并且不同合作的方的播放SDK会产生交叉,不利于播放业务的维护和拓展。
 - 播放器内核难以切换
     - 不同的视频播放器内核,由于api不一样,所以难以切换操作。要是想兼容内核切换,就必须自己制定一个视频接口+实现类的播放器
+
+
+#### 4.1 视频播放器内核封装需求
 - 一定要解耦合
     - 播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核
 - 传入不同类型方便创建不同内核
     - 隐藏内核播放器创建具体细节,开发者只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体播放器类的类名。需要符合开闭原则
-
+- 具体设计方案
+    - 设计统一播放协议,对于上层播放业务,只调用按照统一协议设计接口,不必关心底层播放器的设计逻辑。保证上层播放业务不随新的接入播放SDK发生变化。
 
 
 #### 4.2 播放器内核架构图
@@ -90,6 +108,8 @@
     - 第一部分:视频初始化实例对象方法,主要包括:initPlayer初始化视频,setDataSource设置视频播放器地址,setSurface设置视频播放器渲染view,prepareAsync开始准备播放操作
     - 第二部分:视频播放器状态方法,主要包括:播放,暂停,恢复,重制,设置进度,释放资源,获取进度,设置速度,设置音量
     - 第三部分:player绑定view后,需要监听播放状态,比如播放异常,播放完成,播放准备,播放size变化,还有播放准备
+- 播放器的核心实现要点
+    - 针对上层播放器业务,该内核库提供统一的播放暂停,设置播放状态的接口,由于播放器内核和播放器业务解耦合,所以非常方便快速添加其他sdk播放器,具体可以看这篇文章:[05.视频播放器内核切换封装](https://juejin.im/post/6884023527473856520)
 
 
 
@@ -112,8 +132,9 @@
     - 定义一个view的接口InterControlView,在这里类里定义绑定视图,视图隐藏和显示,播放状态,播放模式,播放进度,锁屏等操作。这个每个实现类则都可以拿到这些属性呢
     - 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来后然后通过addView将视图添加到该控制器中,这样非常方便添加自定义视图
     - 播放器切换状态需要改变Controller视图,比如视频异常则需要显示异常视图view,则它们之间的交互是通过ControlWrapper(同时实现Controller接口和Player接口)实现
-
-
+- 具体如何实现呢
+    - 可以看这篇博客:[06.播放器UI抽取封装](https://juejin.im/post/6884028627697500167)
+    - ![image](https://img-blog.csdnimg.cn/20201013094115174.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 
 
 #### 5.3 关于优先级视图展示
@@ -237,8 +258,7 @@
     - 开启一个线程去请求并预加载一部分的数据,可能需要预加载的数据大于>1,利用队列先进入的先进行加载,因此可以采用LinkedHashMap保存正在预加载的task。
     - 在开始预加载的时候,判断该播放地址是否已经预加载,如果不是那么创建一个线程task,并且把它放到map集合中。然后执行预加载逻辑,也就是执行HttpURLConnection请求
     - 提供取消对应url加载的任务,因为有可能该url不需要再进行预加载了,比如参考抖音,当用户瞬间下滑几个视频,那么很多视频就需要跳过了不需要再进行预加载。这个后期在做
-- 缓存满了该怎么处理
-    - 待完善
+
 
 
 ### 10.如何监控视频埋点
@@ -253,9 +273,6 @@
     - 定义一个类实现该视频埋点接口,重写里面方法。然后需要在初始化配置视频播放器的时候,将这个实现类的对象传递进来即可。通过这个配置类传进来的对象,播放器就可以处理监听设置逻辑呢。
     - 这种操作最大的好处就是:在这个类中统一处理视频的埋点,修改快捷,而不用在每一个有视频播放器的页面埋点,方便维护。比如如何处理视频播放完成监听,代码如下所示:
     ``` java
-    /**
-     * 视频播放完成回调
-     */
     @Override
     public void onCompletion() {
         VideoPlayerConfig config = VideoViewManager.getConfig();
@@ -271,6 +288,10 @@
 ### 11.待实现的需求分析
 - 音视频无缝切换
     - 比如在豆神教育中,有视频播放,也有音频播放,这两块都是写到了业务代码中,能否将两者糅合起来。但音频相比视频,多了一个可以在后台播放的功能,一般用在service中,这一相互切换需求待完善。以满足后期可能出现的需求功能。
+- 优化播放器持续平滑播放
+    - 画中画方案:虽然Android8.0及其以上版本已提供了画中画方案,但是Android8.0以下版本仍然保有大量用户,其缺点就是无法满足Android8.0以下用户需;
+    - 采用系统浮层:采用系统浮层需要系统浮层权限,Android厂商对系统浮层的授权越来越严格,导致用户授权过程的体验比较差;需要权限,可能有些手机不太好适配;
+    - 在每个展示页面单独添加播放器浮窗:优点是不受Android系统版本限制,并且用户无需系统浮层权限授权,适合所有手机用户,体验较好
 
 
 
@@ -283,7 +304,6 @@
     - 提供绝大多数场景的视频播放器功能,完全可以套用demo中的案例,甚至你还可以在案例基础上大幅度优化
 
 
-
 ### 13.参考案例和博客记录
 - exo播放器
     - https://github.com/google/ExoPlayer
@@ -297,7 +317,7 @@
     - https://github.com/lipangit/JiaoZiVideoPlayer
 
 
-
+### 项目地址:https://github.com/yangchong211/YCVideoPlayer