以前的项目里面有视频播放的功能,经过讨论都是选择了第三方播放器 同时也保留了原生播放器
为什么使用第三方播放器,主要解决:
1、MediaPlayer性能的问题
2、MediaPlayer无法支持的功能 解码等
为什么使用双播放器
1、充分利用每一个播放器的优缺点,目前仅考虑MediaPlayer+一款第三方Player
2、部分资源只能使用某个播放器去播放,在播放出现异常上报到后台后,可以针对性的去处理某资源在某类型设备去使用某个播放器,甚至更加的去细化
3、实际使用以第三方播放器为主,项目上线后,除了项目的业务功能,大部分的第三方维护越来越少,到了了后期,出现了问题,在去升级可能成本特别大
在我的实际项目中使用的ExoPlayer还是3年前的代码,现在已经升级到了ExoPlayer2没法在原来的基础上升级维护成本特别大
而且人员都抽调到新项目都在重构新版本,老项目没法抽出人去维护,另外原生的的MediaPlayer随着手机升级的性能也越来越强大并不比3年前的ExoPlayer差 所以有些业务场景是可以使用Mediplaer
播放器接口设计
为了方便以后的维护扩展对常用的方法提取接口 如start,stop, pause seeTo等
1、接口以MediaPlayer为原型设计的接口也可以参照其他的播放器(Exo,ijk)作为原型设计建议以MediaPlayer作为原型
2、基本包含MediaPlayer的播放时候常用的那几个接口,为了使接口使用起来更加规范,对于播放器之间差异化的函数不在接口声明
3、如果必要暴露出来的在实现的Proxy类上要判断是否支持该功能,不支持抛出异常在开发的过程及时发现误用的情况参考
* 编码规则
*播放器值只做播放器该做的事情,和播放器无关的代码,项目的业务代码,不要写在里面 即使某个播放器只会在某一块的业务上使用别的地方都不会用也不要写进播放器里面
*第三方播放器的引入,如果是使用源码lib引入,根据项目需求做针对性修改的时候,不建议修改源码,采取继承的方式或者代理的方式去重写或者复制一份出来在这个基础是去改造
*源码lib引入尽量做到和build.gradle添加依赖的方式无缝切换
*其他的项目组件也尽量如此不要随便引入项目的业务代码使组件更加轻易的解耦
*大概结构:
* IPlayer
********ProxyPlayer implements IPlayer
*********BasePlayer implements IPlayer
**********XPlayer extends BasePlayer
**********MediaPlayer extends BasePlayer
*/
提取的项目代码 ,很多的架构设计都可以参照此原型