ExoPlayer架构详解与源码分析(2)——Player

系列文章目录

ExoPlayer架构详解与源码分析(1)——前言
ExoPlayer架构详解与源码分析(2)——Player
ExoPlayer架构详解与源码分析(3)——Timeline
ExoPlayer架构详解与源码分析(4)——整体架构
ExoPlayer架构详解与源码分析(5)——MediaSource
ExoPlayer架构详解与源码分析(6)——MediaPeriod
ExoPlayer架构详解与源码分析(7)——SampleQueue
ExoPlayer架构详解与源码分析(8)——Loader
ExoPlayer架构详解与源码分析(9)——TsExtractor
ExoPlayer架构详解与源码分析(10)——H264Reader
ExoPlayer架构详解与源码分析(11)——DataSource
ExoPlayer架构详解与源码分析(12)——Cache
ExoPlayer架构详解与源码分析(13)——TeeDataSource和CacheDataSource
ExoPlayer架构详解与源码分析(14)——ProgressiveMediaPeriod
ExoPlayer架构详解与源码分析(15)——Renderer
ExoPlayer架构详解与源码分析(16)——LoadControl
ExoPlayer架构详解与源码分析(17)——TrackSelector



前言

如果让你去开发一款播放器,第一步当然想到的就是设计。使用面向对象的思路,去确定ExoPlayer应该具有哪些功能,对外暴露哪些操作,需要解决哪些问题。将这些功能进一步抽象,最终就产生了本文要说的Player接口,Player接口位于整个播放器的最顶层,相当于描绘了整个播放器的蓝图。

设计播放器

Player接口除了定义了一些用于播放的高阶函数(如play、pause、seek、获取某些状态等)。还对对播放器设计了以下特性:

  • 所有方法(除非有特殊说明)必须在应用线程调用,大部分是主线程,同样回调必须注册在同一线程里。

    这部分主要体现在ExoPlayerImpl和ExoPlayerImplInternal里,ExoPlayerImpl里几乎所有方法都可以在主线程中直接调用,而ExoPlayerImplInternal里维护运行着播放线程(一个HandlerThread),主线程通过播放线程的Handler将消息数据发送给播放线程用于控制播放,播放线程又通过主线程的Handler将播放的状态通过在主线程中回调监听的方法通知主线程。

  • 所提供的方法可能有是否可用的控制,播放器会提供一个可用方法集,用户只能调用里面的可用方法。

    Player中定义了 isCommandAvailable(int command)方法,用来查询当前操作方法是否可用,而可用方法集在播放器初始化时设置,而方法的可用控制主要实现在播放器上层,播放器只提供用于实现的能力。
    如PlayerControlView中,在设置播放速度时,就会先判断COMMAND_SET_SPEED_AND_PITCH这个权限。

    private void setPlaybackSpeed(float speed) {
         
         
        if (player == null || !player.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)) {
         
         
          return;
        }
        player.setPlaybackParameters(player.getPlaybackParameters().withSpeed(speed));
      }
    
  • 用户通过注册Listener 来监听播放状态变化。

    Player中定义了addListener(Listener listener)方法用于注册监听,在初始化时设置监听,这些监听贯穿了播放器的整个生命周期,从资源的加载到播放过程中的状态变化都可以在Listener中获取到,Listener 只会在主线程回调。通过使用主线程的Handler将回调转发到主线程。
    addListener主要实现在ExoPlayerImpl中。

    @Override
    public void addListener(Listener listener) {
         
         
    // 这里的方法调用前没有像其他方法一样校验是否在主线程,这个方法可以在任何线程调用,因为添加的listener最终都会被转发到主线程执行
    listeners.add(checkNotNull(listener));
    }
    //ExoPlayerImpl初始化时,会将主线程的Looper传入,用于转发Listener转发到主线程
    listeners 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值