|
@@ -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视频层级示例图
|
|
|

|
|
|
|
|
|
+
|
|
|
#### 6.2 视频播放器流程图
|
|
|
- 待完善
|
|
|
|
|
|
+
|
|
|
#### 6.3 视频播放器lib库
|
|
|

|
|
|
|
|
|
|
|
|
-
|
|
|
#### 6.4 视频内核lib库介绍
|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
-#### 6.5视频播放器UI库介绍
|
|
|
-
|
|
|
-
|
|
|
|
|
|
|
|
|
+#### 6.5视频播放器UI库介绍
|
|
|
+
|
|
|
|
|
|
|
|
|
### 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.其他说明
|
|
|
+- 
|
|
|
+
|
|
|
+
|
|
|
+#### 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.
|
|
|
+```
|
|
|
|
|
|
|
|
|
|