02.视频播放器整体结构.md 6.0 KB

目录介绍

  • 01.视频常见的布局视图
  • 02.后期可能涉及的视图
  • 03.需要达到的目的和效果
  • 04.视频视图层级示意图
  • 05.整体架构思路分析流程
  • 06.如何创建不同播放器
  • 07.如何友好处理状态控制器
  • 08.交互交给外部开发者
  • 09.关于优先级视图展示
  • 12.开发者使用方法介绍

01.视频常见的布局视图

  • 视频底图(用于显示初始化视频时的封面图)
  • 视频状态视图
    • 加载loading动画视图(有的会显示加载网速)
    • 加载或者播放网络异常视图
    • 加载或者播放视频失败视图
    • 视频播放完成视图(重播提示对话框,播放结束的时候会显示这个界面)
  • 改变亮度和声音
    • 改变声音视图(手势滑动的音量提示框)
    • 改变亮度视图(手势滑动的亮度提示框)
  • 改变视频快进和快退
    • 左右滑动快进和快退视图(手势滑动的快进快退提示框)
  • 顶部控制区视图(包含返回健,title等)
  • 底部控制区视图(包含进度条,播放暂停,时间,切换全屏等)
  • 锁屏布局视图(全屏时展示,其他隐藏)
  • 底部播放进度条视图(很多播放器都有这个)

02.后期可能涉及的视图

  • 手势指导页面(有些播放器有新手指导功能)
  • 离线下载的界面(该界面中包含下载列表, 列表的item编辑(全选, 删除))
  • 用户从wifi切换到4g网络,提示网络切换弹窗界面(当网络由wifi变为4g的时候会显示)
  • 图片广告视图(带有倒计时消失)
  • 开始视频广告视图
  • 非会员试看视图
  • 弹幕视图(这个很重要)
  • 水印显示视图
  • 清晰度列表视图(切换清晰度弹窗)
  • 展示更多视图(下载,分享,切换音频等)
  • 倍速播放界面(用于控制倍速)
  • 底部视频列表缩略图视图
  • 投屏视频视图界面
  • 视频直播间刷礼物界面
  • 老师开课界面

03.需要达到的目的和效果

  • 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换
  • 对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要支持播放器UI高度定制,而不是该lib库中UI代码
  • 针对视频播放,视频投屏,音频播放,播放回放,以及视频直播的功能

04.视频视图层级示意图

4.1 视频层级示意图

4.2 部分视图优先级考虑

05.整体架构思路分析流程

5.1 视频分层

  • 播放器内核
    • 可以切换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接口)实现

5.2 类架构图

06.如何创建不同播放器

  • 目标要求

    • 基础播放器封装了包含ExoPlayer、MediaPlayer,ijkPlayer,声网视频播放器等
    • 可以自由切换初始化任何一种视频播放器,比如通过构造传入类型参数来创建不同的视频播放器

      PlayerFactory playerFactory = IjkPlayerFactory.create();
      IjkVideoPlayer ijkVideoPlayer = (IjkVideoPlayer) playerFactory.createPlayer(this);
      PlayerFactory playerFactory = ExoPlayerFactory.create();
      ExoMediaPlayer exoMediaPlayer = (ExoMediaPlayer) playerFactory.createPlayer(this);
      PlayerFactory playerFactory = MediaPlayerFactory.create();
      AndroidMediaPlayer androidMediaPlayer = (AndroidMediaPlayer) playerFactory.createPlayer(this);
      
  • 使用那种形式创建播放器

07.如何友好处理状态控制器

  • 状态控制器职责
    • 负责所有视图(自定义view视频视图)的状态管理切换

08.交互交给外部开发者

09.关于优先级视图展示

12.开发者使用方法介绍

参考文章