杨充 4 سال پیش
والد
کامیت
ddae95194e

+ 22 - 0
.gitignore

@@ -1,4 +1,23 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+
+
+
+
 # Built application files
+*.apk
 *.ap_
 
 # Files for the ART/Dalvik VM
@@ -52,3 +71,6 @@ google-services.json
 freeline.py
 freeline/
 freeline_project_description.json
+.idea/
+
+

+ 0 - 4
.idea/encodings.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Encoding" addBOMForNewFiles="with NO BOM" />
-</project>

+ 0 - 36
.idea/inspectionProfiles/Project_Default.xml

@@ -1,36 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0">
-    <option name="myName" value="Project Default" />
-    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
-      <option name="TOP_LEVEL_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="INNER_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="METHOD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
-        </value>
-      </option>
-      <option name="FIELD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="IGNORE_DEPRECATED" value="false" />
-      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
-      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
-      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
-      <option name="myAdditionalJavadocTags" value="date" />
-    </inspection_tool>
-  </profile>
-</component>

+ 0 - 12
.idea/modules.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/Demo/Demo.iml" filepath="$PROJECT_DIR$/Demo/Demo.iml" group="YCVideoPlayer/Demo" />
-      <module fileurl="file://$PROJECT_DIR$/VideoCache/VideoCache.iml" filepath="$PROJECT_DIR$/VideoCache/VideoCache.iml" group="YCVideoPlayer/VideoCache" />
-      <module fileurl="file://$PROJECT_DIR$/VideoKernel/VideoKernel.iml" filepath="$PROJECT_DIR$/VideoKernel/VideoKernel.iml" group="YCVideoPlayer/VideoKernel" />
-      <module fileurl="file://$PROJECT_DIR$/VideoPlayer/VideoPlayer.iml" filepath="$PROJECT_DIR$/VideoPlayer/VideoPlayer.iml" group="YCVideoPlayer/VideoPlayer" />
-      <module fileurl="file://$PROJECT_DIR$/YCVideoPlayer.iml" filepath="$PROJECT_DIR$/YCVideoPlayer.iml" group="YCVideoPlayer" />
-    </modules>
-  </component>
-</project>

+ 0 - 12
.idea/runConfigurations.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>

+ 0 - 6
.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
-  </component>
-</project>

+ 4 - 0
README.md

@@ -212,12 +212,15 @@
 #### 6.1视频层级示例图
 ![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)
 
+
 #### 6.2 视频播放器流程图
 - 待完善
 
+
 #### 6.3 视频播放器lib库
 ![image](https://img-blog.csdnimg.cn/20201013092150588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 
+
 #### 6.4 视频内核lib库介绍
 ![image](https://img-blog.csdnimg.cn/2020101309293329.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 ![image](https://img-blog.csdnimg.cn/2020101321464162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
@@ -377,6 +380,7 @@
 ### 10.播放器问题记录说明
 
 
+
 ### 11.性能优化和库大小
 
 

+ 82 - 20
read/01.视频播放器介绍文档.md

@@ -2,13 +2,13 @@
 #### 目录介绍
 - 01.该视频播放器介绍
 - 02.视频播放器功能
-- 03.视频播放器构说明
+- 03.视频播放器构说明
 - 04.视频播放器如何使用
 - 05.播放器详细Api文档
 - 06.播放器封装思路
 - 07.播放器示例展示图
 - 08.添加自定义视图
-- 09.视频优化处理
+- 09.视频播放器优化处理
 - 10.播放器问题记录说明
 - 11.性能优化和库大小
 - 12.视频缓存原理介绍
@@ -91,7 +91,7 @@
 
 
 
-### 03.视频播放器构说明
+### 03.视频播放器构说明
 - 视频常见的布局视图
     - 视频底图(用于显示初始化视频时的封面图),视频状态视图【加载loading,播放异常,加载视频失败,播放完成等】
     - 改变亮度和声音【改变声音视图,改变亮度视图】,改变视频快进和快退,左右滑动快进和快退视图(手势滑动的快进快退提示框)
@@ -117,6 +117,12 @@
     - 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换
     - 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要支持播放器UI高度定制,而不是该lib库中UI代码
     - 针对视频播放,视频投屏,音频播放,播放回放,以及视频直播的功能
+- 通用视频框架特点
+    - 一定要解耦合
+        - 播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核
+        - 播放器player与视频UI解耦:支持添加自定义视频视图,比如支持添加自定义广告,新手引导,或者视频播放异常等视图,这个需要较强的拓展性
+    - 适合多种业务场景
+        - 比如适合播放单个视频,多个视频,以及列表视频,或者类似抖音那种一个页面一个视频,还有小窗口播放视频。也就是适合大多数业务场景
 - 视频分层
     - 播放器内核
         - 可以切换ExoPlayer、MediaPlayer,IjkPlayer,声网视频播放器,这里使用工厂模式Factory + AbstractVideoPlayer + 各个实现AbstractVideoPlayer抽象类的播放器类
@@ -212,24 +218,24 @@
 #### 6.1视频层级示例图
 ![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)
 
+
 #### 6.2 视频播放器流程图
 - 待完善
 
+
 #### 6.3 视频播放器lib库
 ![image](https://img-blog.csdnimg.cn/20201013092150588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 
 
-
 #### 6.4 视频内核lib库介绍
 ![image](https://img-blog.csdnimg.cn/2020101309293329.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 ![image](https://img-blog.csdnimg.cn/2020101321464162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
 
 
-#### 6.5视频播放器UI库介绍
-![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)
-
 
 
+#### 6.5视频播放器UI库介绍
+![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)
 
 
 ### 07.播放器示例展示图
@@ -314,7 +320,29 @@
     ```
 
 
-### 09.视频优化处理
+### 09.视频播放器优化处理
+#### 9.1 如何兼容不同内核播放器
+- 提问:针对不同内核播放器,比如谷歌的ExoPlayer,B站的IjkPlayer,还有原生的MediaPlayer,有些api不一样,那使用的时候如何统一api呢?
+    - 比如说,ijk和exo的视频播放listener监听api就完全不同,这个时候需要做兼容处理
+    - 定义接口,然后各个不同内核播放器实现接口,重写抽象方法。调用的时候,获取接口对象调用api,这样就可以统一Api
+- 定义一个接口,这个接口有什么呢?这个接口定义通用视频播放器方法,比如常见的有:视频初始化,设置url,加载,以及播放状态,简单来说可以分为三个部分。
+    - 第一部分:视频初始化实例对象方法,主要包括:initPlayer初始化视频,setDataSource设置视频播放器地址,setSurface设置视频播放器渲染view,prepareAsync开始准备播放操作
+    - 第二部分:视频播放器状态方法,主要包括:播放,暂停,恢复,重制,设置进度,释放资源,获取进度,设置速度,设置音量
+    - 第三部分:player绑定view后,需要监听播放状态,比如播放异常,播放完成,播放准备,播放size变化,还有播放准备
+- 首先定义一个工厂抽象类,然后不同的内核播放器分别创建其具体的工厂实现具体类
+    - PlayerFactory:抽象工厂,担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口
+    - ExoPlayerFactory:具体工厂,具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建具体产品对象。
+- 如何使用,分为三步,具体操作如下所示
+    - 1.先调用具体工厂对象中的方法createPlayer方法;2.根据传入产品类型参数获得具体的产品对象;3.返回产品对象并使用。
+    - 简而言之,创建对象的时候只需要传递类型type,而不需要对应的工厂,即可创建具体的产品对象
+- 这种创建对象最大优点
+    - 工厂方法用来创建所需要的产品,同时隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
+    - 加入新的产品时,比如后期新加一个阿里播放器内核,这个时候就只需要添加一个具体工厂和具体产品就可以。系统的可扩展性也就变得非常好,完全符合“开闭原则”
+
+
+
+
+#### 9.4 代码方面优化措施
 - **如果是在Activity中的话,建议设置下面这段代码**
     ```
     @Override
@@ -356,14 +384,6 @@
 
 
 ### 10.播放器问题记录说明
-- 关于如何调整视频的播放填充类型。在该库中提供了6中不同类型供你选择,即正常默认类型;16:9类型,4:3类型;充满整个控件视图;剧中裁剪类型等类型,就是模仿了图片设置缩放的方式。其实这个就是设置SurfaceView的宽高……
-    - 这里播放正常视频建议选择16:9类型的,缩放后会有留黑;针对类似快手抖音视频,一个页面一个视频建议选择充满整个控件视图,会裁剪但是会铺满视频。
-- 关于前后台切换视频问题
-    - 从前台切到后台,当视频正在播放或者正在缓冲时,调用该方法暂停视频。
-    - 从后台切换到前台,当视频暂停时或者缓冲暂停时,调用该方法重新开启视频播放。也可以让用户手动去点击播放视频。
-- 播放器在正常播放和全屏模式切换状态栏问题
-    - 待完善,需要处理刘海
-
 
 
 ### 11.性能优化和库大小
@@ -391,10 +411,52 @@
 ### 16.版本更新文档记录
 
 
-### 17.参考项目和博客记录
-- 项目
-    - b站demo:https://github.com/bilibili/ijkplayer/tree/master/android
-    - 谷歌demo:https://github.com/google/ExoPlayer
+
+### 17.其他说明
+- ![image](https://upload-images.jianshu.io/upload_images/4432347-7100c8e5a455c3ee.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+
+#### 17.1 其他推荐说明
+- 其他项目推荐
+    - [1.开源博客汇总](https://github.com/yangchong211/YCBlogs)
+    - [2.降低Crash崩溃库](https://github.com/yangchong211/YCAndroidTool)
+    - [3.视频播放器封装库](https://github.com/yangchong211/YCVideoPlayer)
+    - [4.状态切换管理器封装库](https://github.com/yangchong211/YCStateLayout)
+    - [5.复杂RecyclerView封装库](https://github.com/yangchong211/YCRefreshView)
+    - [6.弹窗封装库](https://github.com/yangchong211/YCDialog)
+    - [7.版本更新封装库](https://github.com/yangchong211/YCUpdateApp)
+    - [8.状态栏封装库](https://github.com/yangchong211/YCStatusBar)
+    - [9.轻量级线程池封装库](https://github.com/yangchong211/YCThreadPool)
+    - [10.轮播图封装库](https://github.com/yangchong211/YCBanner)
+    - [11.音频播放器](https://github.com/yangchong211/YCAudioPlayer)
+    - [12.画廊与图片缩放控件](https://github.com/yangchong211/YCGallery)
+    - [13.Python多渠道打包](https://github.com/yangchong211/YCWalleHelper)
+    - [14.整体侧滑动画封装库](https://github.com/yangchong211/YCSlideView)
+    - [15.Python爬虫妹子图](https://github.com/yangchong211/YCMeiZiTu)
+    - [17.自定义进度条](https://github.com/yangchong211/YCProgress)
+    - [18.自定义折叠和展开布局](https://github.com/yangchong211/YCExpandView)
+    - [19.商品详情页分页加载](https://github.com/yangchong211/YCShopDetailLayout)
+    - [20.在任意View控件上设置红点控件](https://github.com/yangchong211/YCRedDotView)
+    - [21.仿抖音一次滑动一个页面播放视频库](https://github.com/yangchong211/YCScrollPager)
+
+
+
+#### 17.2 关于LICENSE
+```
+Copyright 2017 yangchong211(github.com/yangchong211)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+```
 
 
 

+ 1 - 1
read/02.视频播放器整体结构.md

@@ -53,7 +53,7 @@
 ### 03.需要达到的目的和效果
 - 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换
 - 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要支持播放器UI高度定制,而不是该lib库中UI代码
-- 针对视频播放,视频投屏,音频播放,播放回放,以及视频直播的功能
+- 针对视频播放,音频播放,播放回放,以及视频直播的功能。使用简单,代码拓展性强,封装性好,主要是和业务彻底解耦,暴露接口监听给开发者处理业务具体逻辑
 
 
 

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

@@ -2,7 +2,11 @@
 #### 目录介绍
 - 01.视频播放器的痛点
 - 02.业务需求的目标
-- 03.
+- 03.该播放器框架特点
+- 04.播放器内核封装
+- 05.播放器UI层封装
+- 06.如何简单使用
+- 07.如何自定义播放器
 
 
 
@@ -27,16 +31,80 @@
 - 音视频播放框架
     - 视频播放等于MediaPlayer和SurfaceView,MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的组件来显示MediaPlayer播放的图像输出,我们可以使用SurfaceView来显示
     - 能否实践开发出一套音视频播放的通用架构,能支持音频播放场景,也能播放视频场景,还可以无缝切换。比如视频切换音频操作,增强库的功能性
+    - 视频窗口、音频窗口、视频浮窗、音频浮窗、短视频窗口、短视频浮窗、音频控制台等多种场景播放,需要灵活切换,这个也是一个大的难点
 
 
+### 03.该播放器框架特点
+#### 3.1 通用视频框架特点
+- 一定要解耦合
+    - 播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核
+    - 播放器player与视频UI解耦:支持添加自定义视频视图,比如支持添加自定义广告,新手引导,或者视频播放异常等视图,这个需要较强的拓展性
+- 适合多种业务场景
+    - 比如适合播放单个视频,多个视频,以及列表视频,或者类似抖音那种一个页面一个视频,还有小窗口播放视频。也就是适合大多数业务场景
 
 
 
+#### 3.2 视频分层
+- 播放器内核
+    - 可以切换ExoPlayer、MediaPlayer,IjkPlayer,声网视频播放器,这里使用工厂模式Factory + AbstractVideoPlayer + 各个实现AbstractVideoPlayer抽象类的播放器类
+    - 定义抽象的播放器,主要包含视频初始化,设置,状态设置,以及播放监听。由于每个内核播放器api可能不一样,所以这里需要实现AbstractVideoPlayer抽象类的播放器类,方便后期统一调用
+    - 为了方便创建不同内核player,所以需要创建一个PlayerFactory,定义一个createPlayer创建播放器的抽象方法,然后各个内核都实现它,各自创建自己的播放器
+- VideoPlayer播放器
+    - 可以自由切换视频内核,Player+Controller。player负责播放的逻辑,Controller负责视图相关的逻辑,两者之间用接口进行通信
+    - 针对Controller,需要定义一个接口,主要负责视图UI处理逻辑,支持添加各种自定义视图View【统一实现自定义接口Control】,每个view尽量保证功能单一性,最后通过addView形式添加进来
+    - 针对Player,需要定义一个接口,主要负责视频播放处理逻辑,比如视频播放,暂停,设置播放进度,设置视频链接,切换播放模式等操作。需要注意把Controller设置到Player里面,两者之间通过接口交互
+- UI控制器视图
+    - 定义一个BaseVideoController类,这个主要是集成各种事件的处理逻辑,比如播放器状态改变,控制视图隐藏和显示,播放进度改变,锁定状态改变,设备方向监听等等操作
+    - 定义一个view的接口InterControlView,在这里类里定义绑定视图,视图隐藏和显示,播放状态,播放模式,播放进度,锁屏等操作。这个每个实现类则都可以拿到这些属性呢
+    - 在BaseVideoController中使用LinkedHashMap保存每个自定义view视图,添加则put进来后然后通过addView将视图添加到该控制器中,这样非常方便添加自定义视图
+    - 播放器切换状态需要改变Controller视图,比如视频异常则需要显示异常视图view,则它们之间的交互是通过ControlWrapper(同时实现Controller接口和Player接口)实现
 
 
 
+### 04.播放器内核封装
+#### 4.1 视频播放器内核封装需求
+- 播放器内核难以切换
+    - 不同的视频播放器内核,由于api不一样,所以难以切换操作。要是想兼容内核切换,就必须自己制定一个视频接口+实现类的播放器
+- 一定要解耦合
+    - 播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核
+- 传入不同类型方便创建不同内核
+    - 隐藏内核播放器创建具体细节,开发者只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体播放器类的类名。需要符合开闭原则
+
+
+#### 4.2 播放器内核架构图
+![image](https://img-blog.csdnimg.cn/2020101321464162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+
+
+
+#### 4.3 如何兼容不同内核播放器
+- 提问:针对不同内核播放器,比如谷歌的ExoPlayer,B站的IjkPlayer,还有原生的MediaPlayer,有些api不一样,那使用的时候如何统一api呢?
+    - 比如说,ijk和exo的视频播放listener监听api就完全不同,这个时候需要做兼容处理
+    - 定义接口,然后各个不同内核播放器实现接口,重写抽象方法。调用的时候,获取接口对象调用api,这样就可以统一Api
+- 定义一个接口,这个接口有什么呢?这个接口定义通用视频播放器方法,比如常见的有:视频初始化,设置url,加载,以及播放状态,简单来说可以分为三个部分。
+    - 第一部分:视频初始化实例对象方法,主要包括:initPlayer初始化视频,setDataSource设置视频播放器地址,setSurface设置视频播放器渲染view,prepareAsync开始准备播放操作
+    - 第二部分:视频播放器状态方法,主要包括:播放,暂停,恢复,重制,设置进度,释放资源,获取进度,设置速度,设置音量
+    - 第三部分:player绑定view后,需要监听播放状态,比如播放异常,播放完成,播放准备,播放size变化,还有播放准备
+
+
+
+### 05.播放器UI层封装
+
+
+
+### 06.如何简单使用
+- 播放单个视频
+
+
+- 播放多个视频
+
+
+
+- 列表播放视频
+
+
 
 
+### 07.如何自定义播放器
 
 
 

+ 6 - 2
read/05.播放器内核切换封装.md

@@ -10,7 +10,12 @@
 
 
 ### 01.视频播放器内核封装需求
-
+- 播放器内核难以切换
+    - 不同的视频播放器内核,由于api不一样,所以难以切换操作。要是想兼容内核切换,就必须自己制定一个视频接口+实现类的播放器
+- 一定要解耦合
+    - 播放器内核与播放器解耦: 支持更多的播放场景、以及新的播放业务快速接入,并且不影响其他播放业务,比如后期添加阿里云播放器内核,或者腾讯播放器内核
+- 传入不同类型方便创建不同内核
+    - 隐藏内核播放器创建具体细节,开发者只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体播放器类的类名。需要符合开闭原则
 
 
 ### 02.播放器内核架构图
@@ -506,7 +511,6 @@
 
 
 
-
 
 
 

+ 42 - 1
read/06.播放器UI抽取封装.md

@@ -1,11 +1,52 @@
-# 视频封装思路
+# 06.播放器UI抽取封装
 #### 目录介绍
+- 01.视频播放器UI封装需求
+- 02.播放器UI架构图
+- 03.如何分离播放和UI分离
+- 04.VideoPlayer如何实现
+- 05.VideoController实现
+- 06.播放Player和UI通信
+- 07.如何添加自定义播放视图
 
 
 
+### 01.视频播放器UI封装需求
+- 播放器内核和UI层耦合
+    - 也就是说视频player和ui操作柔和到了一起,尤其是两者之间的交互。比如播放中需要更新UI进度条,播放异常需要显示异常UI,都比较难处理播放器状态变化更新UI操作
+- UI难以自定义或者修改麻烦
+    - 比如常见的视频播放器,会把视频各种视图写到xml中,这种方式在后期代码会很大,而且改动一个小的布局,则会影响大。这样到后期往往只敢加代码,而不敢删除代码……
+    - 有时候难以适应新的场景,比如添加一个播放广告,老师开课,或者视频引导业务需求,则需要到播放器中写一堆业务代码。迭代到后期,违背了开闭原则,视频播放器需要做到和业务分离
+- 视频播放器结构不清晰
+    - 这个是指该视频播放器能否看了文档后快速上手,知道封装的大概流程。方便后期他人修改和维护,因此需要将视频播放器功能分离。比如切换内核+视频播放器(player+controller+view)
+- 一定要解耦合
+    - 播放器player与视频UI解耦:支持添加自定义视频视图,比如支持添加自定义广告,新手引导,或者视频播放异常等视图,这个需要较强的拓展性
+- 适合多种业务场景
+    - 比如适合播放单个视频,多个视频,以及列表视频,或者类似抖音那种一个页面一个视频,还有小窗口播放视频。也就是适合大多数业务场景
 
 
 
+### 02.播放器UI架构图
+
+
+
+### 03.如何分离播放和UI分离
+- 
+
+
+
+### 04.VideoPlayer如何实现
+
+
+### 05.VideoController实现
+
+
+
+### 06.播放Player和UI通信
+
+
+
+### 07.如何添加自定义播放视图
+