目录
- ExoPlayer基本介绍
- ExoPlayer的基本使用
- 遇到的问题
- 资料
- 收获
从这篇开始我们进入阶段五 —— 一些音视频开源项目的学习使用分析,今天我们进入ExoPlayer部分的学习实践
一、ExoPlayer基本介绍
1.1 ExoPlayer优缺点
ExoPlayer是谷歌开源的一个应用级的音视频播放器。ExoPlayer 支持基于 HTTP 的动态自适应流 (DASH)、SmoothStreaming 和通用加密、以及可以很好的支持播放队列、播放源的无缝切换等功能。它采用易于自定义和扩展的设计。
内部的实现也是调用了低层API,比如:MediaCodec、AudioTrack等
画张表格来对比下ExoPlayer和MediaPlayer,更直观地了解
ExoPlayer的代码仓库地址是*
https://github.com/google/ExoPlayer*
红色框框起来的,核心部分加ui的library也是我们这个系列学习使用重点。
1.2 ExoPlayer架构设计
ExoPlayer的核心是ExoPlayer的接口,其中定义了包涵传统播放器的功能(缓冲音视频、播放、暂停、seek等)。ExoPlayer没有设定可以播放的媒体类型、存储方式以及渲染方式,也没有直接实现加载和播放。而是在播放器被创建或者准备播放时将这些工作代理给注册的组件来实现。下面是一些常见ExoPlayer的组件实现:
- MediaSource 加载媒体,通过ExoPlayer.prepare注册
- TrackSelector:音/视轨提取器,从MediaSource中提取出轨道的数据
- Render:对TrackSelector提取出来的数据进行渲染,AudioTrack播放音频、Surface渲染视频
- LoadControl:对MediaSource进行控制(什么时候开始缓冲、缓冲多少等)
ExoPlayer为这些组件提供了默认的实现,如果需要定制可以自定义组件来扩展实现。
通过ExoPlayer的架构图,我们也可以看到其组件模块化的设计,这个架构设计值得学习,也是好的组件/SDK的一个重要要求。在我们的日常项目开发中,开发一个组件 从易用性和易扩展性方面考虑,既要保证使用者很容易上手使用(提供一套默认实现),又要有方便使用者根据自己的场景进行方便的扩展的能力。
1.3 状态机
在看ExoPlayer的状态机之前,我们先看下MeidaPlayer的状态机
可以看到MediaPlayer的状态比较多,使用时如果在不当的位置触发了不匹配的操作,直接会崩溃。
相比MediaPlayer,ExoPlayer的状态少了些,也更容易使用区分,不像MediaPlayer在没有prepared之前都不可以进行播放相关操作,ExoPlayer很多listener以及isplaying的API监听状态的变化。ExoPlayer的四种状态如下
STATE_IDLE:初始状态,此时播放器没有可以播放的资源,播放器停止播放或者播放失败后也会处于该状态
STATE_BUFFERING: 没有足够的数据可以加载播放,此时无法立即播放
STATE_READY : 播放器可以立即播放,是否播放取决于playWhenReady的值,该值表达了使用者的意愿,为true,将会开始播放,否则不播。
STATE_ENDED: 播放完了所有的资源后处于该状态
二、ExoPlayer的简单使用
这一小节我们学习实践ExoPlayer的使用
2.1 AS中引入library
ExoPlayer有很好的扩展性和可定制性,可以根据项目需要进行选择对应的模块,也可以全部包含。
exoplayer-core: Core functionality (required).
exoplayer-dash: Support for DASH content.
exoplayer-hls: Support for HLS content.
exoplayer-smoothstreaming: Support for SmoothStreaming content.
exoplayer-ui: UI components and resources for use with ExoPlayer.
我们根据需要来添加library
接下来出创建一个容器PlayerView以及ExoPlayerView进行播放
2.2 创建播放器、绑定播放器容器、设置数据源、prepare
2.3 播放监听
当前是否在播放中
播放状态改变的listener、音频相关的listener、视频相关的listener
用于分析用的listener(会输出更详细的信息)
2.4 释放资源
在页面不可见/销毁(看是否需要后台播放)时要释放资源
完整代码已上传至 github
https://github.com/ayyb1988/mediajourney
三、遇到的问题
问题1
2.13.3前多了一个空格,这个太….,细节有时候不注意就好浪费不少时间。
问题2
没有加 络权限的原因,Mainfest中静态注册后,在requesetPermission中动态的请求下。通过这个崩溃堆栈,我们可以看到ExoPlayer加载 络视频使用的是Okhttp
问题3
X86模拟器播放时偶尔会闪退,真机正常。机型设备的适配问题始终是一个大问题
四、资料
- Media streaming with ExoPlayer
- ExoPlayer blog
- ExoPlayer developer guide
- ExoPlayer播放音视频的使用介绍
五、 收获
通过本次学习实践收获如下:
- 了解ExoPlayer的背景以及相比MediaPlayer的优缺点
- 了解ExoPlayer的基本功能
- 简单实践
感谢你的阅读
欢迎交流
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!