- Player 播放内核层:IjkMediaPlayer、ExoPlayr2、MediaPlayer(IPlayerManager)。
- Cache 缓存层:ProxyCacheManager、ExoPlayerCacheManager(ICacheManager)。
- Manager 内核管理层:GSYVideoManager(GSYVideoBaseManager <- GSYVideoViewBridge)。
- Video 播放器控件层:GSYTextureRenderVIew 到 GSYVideoPlayer 五层。
- Render 渲染控件层:TextureView、SurfaceView、GLSurfaceView(GSYRenderView <- IGSYRenderView)。
目前整个video层即是传统controller层,也是大部分时候自定义实现需要继承的层
* 管理层GSVideoManager继承GSYVideoBaseManager,通过IPlayerManager控制播放内核。
* 管理层GSVideoManager实现了GSYVideoViewBridge,和UI层交互(主要通过UI层的GSYVideoPlayer)。
* Cache层主要是对缓存的实现和管理,目前有通用的代理缓存,与exo的CacheDataSourceFactory。
* UI层GSYTextureRenderView通过GSYRenderView,内置IGSYRenderView实现类,和渲染层交互。
* UI层逐层继承实现各层逻辑,内部大部分方法为protect。
从这里看出,项目的播放内核、管理器、渲染层都是可以自定义替换的。
项目目前内部主要提供控制API和少量配置API: API地址。
项目目前UI层大部分方法和变量都是protect,虽然就封装性而言这并不是很好,但你可以继承后快捷实现你的自定义。
例如:
-
重写
getLayoutId()
方法,返回你的自定义布局,重用逻辑的控件只要控件Id一致即可。若需要新增控件,可重载init(Context context)
方法参考源码实现,其中注意如有自定义参数,需要重载cloneParams
实现大小屏同步,更甚至可以重载startWindowFullscreen
和resolveNormalVideoShow
,参考源码和demo,这很简单, 如Demo中: SampleCoverVideo。 -
如Demo中:EmptyControlVideo,重载
touchSurfaceMoveFullLogic
和touchDoubleUp
,实现了触摸相关的自定义。 -
同样
showWifiDialog
、showProgressDialog
、showVolumeDialog
等重写实现你的自定义弹窗;onClickUiToggle、
changeUiTo****、
OnClick、
OnTouch、
touchDoubleUp`等方法重载可自定义手势行为。
如上图所示,前面说过播放内核Player层、Manger层、渲染层都是可以替换的,只要实现了对应的接口,继承后替换对应的实现类,就可以替换对应层的内部实现逻辑。 例如Demo中: ListMultiVideoActivity 、CustomManager 、MultiSampleVideo 就演示了如何通过自定义Manager实现,多个播放内核同时播放的效果。