① 前言

在这之前笔者使用原生的MediaPlayer、B站开源的IJKVideoView等播放器。知道发现ExoPlayer,这款由YouTube开发的播放器真的是非常强大。对于自定义播放器非常友好,里面讲很多模块抽象成独立的组件可供使用者自行定制,当然官方也提供了一些默认的实现。如果你正在开发视频类功能,强烈推荐你尝试一下ExoPlayer。

预备知识
  • DRM:Digital Rights Management,即数字版权管理。指的是出版者用来控制被保护对象的使用权的一些技术,这些技术保护的有数字化内容(例如:软件、音乐、电影)。

  • PlayReady:PlayReady是微软推出的一种DRM解决方案,其工作原理读者可自行查阅相关资料。

  • Widevine:同上,Widevine属于谷歌的一种DRM解决方案

② ExoPlayer的优缺点
优点
  • 在不同Android版本和不同的手机设备上拥有更统一的行为表现,更少的设备差异带来的问题。
  • 作为一个独立的库,可以很轻易的升级。
  • 可以根据用户的需求方便的对播放器行为进行定制和扩展,ExoPlayer中的很多组件都支持自定义和扩展。
  • 支持播放视频列表,并且可以支持对视频的裁剪、合并,以及循环播放设置。
  • 支持更多的视频格式,包括MediaPlayer不支持的DASHSmoothStreaming
  • 支持 Widevine功能,这个功能可以下载和播放经过Google加密的视频文件。
  • 能够方便的集成额外的扩展库,比如IMA扩展库。
缺点
  • 相比于Android原生的MediaPlayer,ExoPlayer将显著的消耗更多的电量
  • 集成ExoPlayer将对你的APP包体增加几百KB的大小
③ 支持设备情况

ExoPlayer支持大部分流媒体格式,并且对DRM的支持也比较友好,比如下方就是官方提供的支持的设备情况:

用例 Android版本号 Android API Level
Audio Playback 4.1 16
Video Playback 4.1 16
DASH(no DRM) 4.1 16
DASH(Widevine CENC; “cenc” scheme) 4.4 19
DASH (ClearKey) 5.0 21
SmoothStreaming (no DRM) 4.1 16
SmoothStreaming (PlayReady SL2000) AndroidTV AndroidTV
HLS (no DRM) 4.1 16
HLS (AES-128 encryption) 4.1 16
HLS (Widevine CENC; “cenc” scheme) 4.4 19
HLS (Widevine CENC; “cbcs” scheme) 7.1 25
④ ExoPlayer的使用

我们只要按照下面的步骤就能简单的将ExoPlayer使用起来了:

  • 1、添加对ExoPlayer库的依赖
  • 2、创建一个SimpleExoPlayer实例
  • 3、将播放器关联到播放渲染的View上
  • 4、将播放资源包装类MediaSource的对象准备好,通过ExoPlayer的prepare()方法设置进去
  • 5、当我们不需要播放的时候记得通过release方法进行释放

上面已经整体介绍了使用ExoPlayer去播放视频的步骤。下面我们就针对每一个步骤详细的去介绍下如何具体地落实到代码中去。

添加ExoPlayer的依赖

首先我们要保证在项目根目录的build.gradle中包含Google和JCenter仓库:

repositories {google()jcenter()
}

在app module的build.gradle中添加对ExoPlayer的依赖:

implementation 'com.google.android.exoplayer:exoplayer:2.8.4'

当然2.8.4不是唯一的版本,你可以使用任意一个release版本。注意,如果你依赖比较高版本的ExoPlayer,恰好的你的项目中有依赖support包,由于高版本的ExoPlay依赖Androidx,所以会出现冲突。所以,在使用高版本ExoPlayer之前,需要将support包和Androidx之间的冲突先解决。

另外需要注意的是,在所有有依赖ExoPlayer库的模块中都需要打开对Java8的支持,需要在模块的build.gradle中添加如下代码:

compileOptions {targetCompatibility JavaVersion.VERSION_1_8
}
创建播放器实例

ExoPlayer提供了一个工厂类ExoPlayerFactory用来实例化不同的ExoPlayer的对象。工厂类里面提供了很多可自定义的一些参数用来定制个性化的播放器实例。例如我们下面使用的例子就是通过newSimpleInstance方法实例化一个SimpleExoPlayer对象。

BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(videoTackSelectionFactory);
LoadControl loadControl = new DefaultLoadControl();
mExoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
将播放器绑定到渲染的View

ExoPlayer库本身给我们提供了一个将播放控制操作,字幕以及surface封装好的PlayerView。我们可以直接在我们的布局文件中引用PlayerView。并通过下面的方式和播放器绑定:

playerView.setPlayer(mExoPlayer);
播放前的准备

对于ExoPlayer而言,所有被用来进行播放的资源都使用MediaSource进行包装。所以当需要播放媒体资源时,你得先创建一个和资源相关的MediaSource对象,然后通过ExoPlayer.prepare方法将封装的对象传入。ExoPlayer提供了非常丰富的MediaSource类型,可用来播放DASH(DashMediaSource)、SmoothStreaming(SsMediaSource)、HLS(HlsMediaSource),以及用来播放多资源拼接的(ConcatenatingMediaSource)等等。示例如下:

ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource(mediaSources);
mExoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);
mExoPlayer.prepare(concatenatingMediaSource);
控制播放

当播放准备好了以后,我们可以通过setPlayWhenReady方法控制播放,当然ExoPlayer也提供了丰富的API去控制播放的过程。我们可以参考官方的API说明:官方文档

释放播放器

当我们不再使用播放器的时候,将手机有限的资源进行释放是非常的必要的。我们可以使用下面的代码对播放器进行释放:

mExoPlayer.release();
⑤ 小结

本文简单介绍下EXOPlayer的基本使用。如果笔者感兴趣可以去官方项目地址学习源码。也可以阅读官方的文档。既然是Yutube使用的播放器,如何强大读者自行去挖掘,也可挖掘源码中的设计架构。

项目地址:https://github.com/google/ExoPlayer
官方文档:https://exoplayer.dev

ExoPlayer官方中文使用文档相关推荐

  1. 宏基因组扩增子最新分析流程QIIME2:官方中文帮助文档

    本网对Markdown排版支持较差,对格式不满意的用户请跳转至 或"宏基因组"公众号阅读: 注:文为蓝色字均为文章链接,可点击直达 写在前面 **声明:本文为QIIME2官方帮助文 ...

  2. GeoPandas官方快速入门文档(中文翻译版)

    GeoPandas官方快速入门文档(中文翻译版) 原文链接>>Introduction to GeoPandas 点这里可以一键跑通>>GeoPandas 简介 GeoPand ...

  3. 强大的矢量图形库:Raphael JS 中文帮助文档及教程

    Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操作 DOM 来轻松创建出 ...

  4. ffmpeg的中文学习文档

    ffmpeg的中文学习文档 文章目录: 一.ffmpeg介绍 二.学习参考文档 1.中文 一.ffmpeg介绍 ffmpeg是视频处理工具,可选参数非常多,功能也非常的强大,可以用来开发各种视频处理工 ...

  5. GRUB4DOS中文自述文档;Grub4dos中文ReadMe

    GRUB4DOS中文自述文档 版本:0.4.4-2009-03-18 英文版作者:tinybit (tinybit@tom.com) 中文版译者:zw2312914(zw2312914@126.com ...

  6. Highcharts中文帮助文档

    Highcharts中文帮助文档 Highcharts 简介: Highcharts 是一个制作图表的 Javascript 类库,可以制作的图表有:直线图,曲线图.区域图.区域曲线图.柱状图.饼装图 ...

  7. VIM7.3添加中文帮助文档

    安装中文帮助文档之前首先执行下列操作: 在home目录下列新建文件夹  : .vim ------------------>.vim是一个隐藏文件,不要漏了 "." .vim ...

  8. jQuery1·3中文参考文档下载

    现在才接触jQuery,看来我是很火星了.  附上jQuery1·3中文参考文档下载:http://files.cnblogs.com/conan304/jQueryAPI_CHM.zip 转载于:h ...

  9. 【转】(六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration

    原创至上,移步请戳:(六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration 5.Animation Integration(动画集成) 动画 ...

最新文章

  1. 【机器学习】基于人工鱼群算法的非线性函数寻优
  2. 大众点评字体_点评里的神笔马良!她的美食笔记会让你惊掉下巴!
  3. 监控linux空间变化,Linux监控文件变化及主动上报实现
  4. asp.net mvc+httpclient+asp.net mvc api入门篇
  5. ZZULIOJ 1116: 删除元素
  6. linux查看 mysql 登陆 失败_Linux安装完mysql后提示错误无法登陆mysql怎么办?
  7. python2.7.5 怎么装redis_python中Redis的简要介绍以及Redis的安装,配置
  8. 自动驾驶算法-滤波器系列(二)—— 卡尔曼滤波简介及其变种(EKF、UKF、PF)介绍
  9. Python3——使用exec和eval执行字符串及计算其结果
  10. HDR图像渲染滤镜软件:Topaz Adjust AI for mac
  11. HDU 2000 Java 奇怪的jio
  12. poj2706 connect
  13. 采购时候遇到价格“虚高”,如何“灵魂”砍价?
  14. 白领沉迷EXCEL式生存
  15. POSIX正则表达式
  16. Echarts折线图曲线图和三维图
  17. 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面鸡和兔子的总数a和脚的总数b,问笼子里面有多少只鸡,有多少只兔子
  18. python科学计算和可视化编程
  19. 【恭贺新春】2019年春节放假
  20. 基于51单片机PM2.5空气质量检测仪设计(毕设)

热门文章

  1. 盘点76个当下全球免费、优质机器学习数据集获取资源
  2. 修改centos终端提示符背景色
  3. 常见的python图形-线性图
  4. 多节点OpenStack Charms 部署指南0.0.1.dev303--21--控制器备份和还原
  5. Hibernate实例--注解配置表映射
  6. [常微分方程的数值解法系列三] 改进欧拉法(预估校正法)
  7. 用计算机弹远走高飞谱,远走高飞计算器音谱 | 手游网游页游攻略大全
  8. 58显示服务器异常怎么回事,手机登录云服务器异常
  9. 如何有效提升你的论证写作能力?
  10. TCP连接被意外重置的原因