Back to Gsyvideoplayer

GSYVIDEO PLAYER PROJECT INFO

doc/GSYVIDEO_PLAYER_PROJECT_INFO.md

13.0.06.0 KB
Original Source

GSYVideoPlayer项目说明(Beta1)

Click to see the English version

项目经过多版本调整之后,目前大致结构分为如下 :

  • Player 播放内核层:IjkMediaPlayer、ExoPlayr2、MediaPlayer(IPlayerManager)。
  • Cache 缓存层:ProxyCacheManager、ExoPlayerCacheManager(ICacheManager)。
  • Manager 内核管理层:GSYVideoManager(GSYVideoBaseManager <- GSYVideoViewBridge)。
  • Video 播放器控件层:GSYTextureRenderVIew 到 GSYVideoPlayer 五层。
  • Render 渲染控件层:TextureView、SurfaceView、GLSurfaceView(GSYRenderView <- IGSYRenderView)。
  • 扩展能力层:字幕、预览、截图、GL 效果、清晰度切换等能力优先挂在 UI/Manager/Render 这些可替换层,避免直接污染内核层。

目前整个video层即是传统controller层,也是大部分时候自定义实现需要继承的层

结构如下图:


* 管理层GSVideoManager继承GSYVideoBaseManager,通过IPlayerManager控制播放内核。

* 管理层GSVideoManager实现了GSYVideoViewBridge,和UI层交互(主要通过UI层的GSYVideoPlayer)。

* Cache层主要是对缓存的实现和管理,目前有通用的代理缓存,与exo的CacheDataSourceFactory。

* UI层GSYTextureRenderView通过GSYRenderView,内置IGSYRenderView实现类,和渲染层交互。

* UI层逐层继承实现各层逻辑,内部大部分方法为protect。

从这里看出,项目的播放内核、管理器、渲染层都是可以自定义替换的。

近期能力对应的层级

近期新增和调整的播放能力,可以按下面方式理解:

能力所在层级说明
通用外挂字幕Video/UI 层GSYSubtitleControllerGSYSubtitleView 根据播放器进度渲染 SRT/WebVTT,加载失败不影响主视频。
WebVTT 进度条预览Demo + Preview ProviderPreViewGSYVideoPlayer 消费 GSYVideoPreviewProvider,缩略图和 sprite 坐标由业务侧或服务端提供。
截图Render + Video 层Render 层负责取视频帧,StandardGSYVideoPlayer 新增组合截图 API,用于叠加播放器 UI。
GLSurfaceView 效果Render 层GL renderer 负责滤镜、纹理、截图和 release,Demo 退出时恢复原全局 render type。
多 URL 清晰度切换Video + Manager 层SmartPickVideo 使用临时 manager 预加载新 URL,seek 同步后提交,失败时回退原播放。
Exo 自适应清晰度Exo Manager 层HLS master / DASH MPD 走单个媒体时间线,Media3 TrackSelector 自动选轨,固定清晰度使用 TrackSelectionOverride。
完成后保留最后一帧Demo Video 层KeepLastFrameVideo 只作为业务语义验证,不改变基础播放器默认完成态。
播放器初始化失败处理Manager + Player 层GSYVideoBaseManager 和各 IPlayerManager 将内核创建/初始化异常收敛到错误回调和资源清理。
Exo cache 与 GIF 清理Cache + Utils 层ExoSourceManager 管理 Exo cache 生命周期,GifCreateHelper 负责 GIF 生成状态和临时资源清理。

更完整的入口、API、回归清单见 RECENT_FEATURES.md

自定义流程

1、通过API实现

项目目前内部主要提供控制API和少量配置API: API地址

2、通过继承实现自定义UI

项目目前UI层大部分方法和变量都是protect,虽然就封装性而言这并不是很好,但你可以继承后快捷实现你的自定义。

例如:

  • 重写getLayoutId()方法,返回你的自定义布局,重用逻辑的控件只要控件Id一致即可。若需要新增控件,可重载init(Context context)方法参考源码实现,其中注意如有自定义参数,需要重载cloneParams实现大小屏同步,更甚至可以重载startWindowFullscreenresolveNormalVideoShow,参考源码和demo,这很简单, 如Demo中: SampleCoverVideo

  • 如Demo中:EmptyControlVideo,重载 touchSurfaceMoveFullLogictouchDoubleUp,实现了触摸相关的自定义。

  • 同样showWifiDialogshowProgressDialogshowVolumeDialog等重写实现你的自定义弹窗;onClickUiTogglechangeUiTo****OnClickOnTouchtouchDoubleUp`等方法重载可自定义手势行为。

3、通过替换实现

如上图所示,前面说过播放内核Player层、Manger层、渲染层都是可以替换的,只要实现了对应的接口,继承后替换对应的实现类,就可以替换对应层的内部实现逻辑。 例如Demo中: ListMultiVideoActivityCustomManagerMultiSampleVideo 就演示了如何通过自定义Manager实现,多个播放内核同时播放的效果。

4、全屏和非全屏是通过重构 View 来实现的,主要参数有 cloneParams \ resolveFullVideoShowstartWindowFullscreen 等方法的实现,另外外部获取记得水涌 player.getCurrentPlayer() 获取区分

5、整套的自定义demo

演示整套自定义的Demo

6、还无法解决(`・ω・´),那就提个issue吧!