2019独角兽企业重金招聘Python工程师标准>>>

一、介绍

ExoPlayer是google开源的应用级媒体播放器项目,该开源项目包含ExoPlayer库和演示demo,github地址:https://github.com/google/ExoPlayer。

二、概述

ExoPlayer库的核心是ExoPlayer接口。ExoPlayer公开了传统的高水平媒体播放器的功能,例如媒体缓冲,播放,暂停和快进功能。ExoPlayer没有直接实现媒体文件的加载和渲染,而是把这些工作委托给了在创建播放器或者播放器准备好播放的时候注入的组件。所有ExoPlayer实现的通用组件是:

  • MediaSource:媒体资源,用于定义要播放的媒体,加载媒体,以及从哪里加载媒体。简单的说,MediaSource就是代表我们要播放的媒体文件,可以是本地资源,可以是网络资源。MediaSource在播放开始的时候,通过ExoPlayer.prepare方法注入。
  • Renderer:渲染器,用于渲染媒体文件。当创建播放器的时候,Renderers被注入。
  • TrackSelector:轨道选择器,用于选择MediaSource提供的轨道(tracks),供每个可用的渲染器使用。
  • LoadControl:用于控制MediaSource何时缓冲更多的媒体资源以及缓冲多少媒体资源。LoadControl在创建播放器的时候被注入。

三、使用

1、添加依赖

implementation 'com.google.android.exoplayer:exoplayer:2.X.X'

此种方式依赖了整个ExoPlayer库。我们也可以只依赖自己真正需要的库。例如果你要播放普通的媒体资源,你可以只依赖Core,UI这两个个库。

implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'

整个ExoPlayer库包括5个子库,依赖了整个ExoPlayer库和依赖5个子库是等效的。

  • exoplayer-core:核心功能 (必要)
  • exoplayer-dash:支持DASH内容
  • exoplayer-hls:支持HLS内容
  • exoplayer-smoothstreaming:支持SmoothStreaming内容
  • exoplayer-ui:用于ExoPlayer的UI组件和相关的资源。

  2、在布局文件中加入PlayerView

<com.google.android.exoplayer2.ui.PlayerViewandroid:id="@+id/exo_play_view"android:layout_width="match_parent"android:layout_height="match_parent" />
private PlayerView mPlayerView;@Override
protected void onCreate(Bundle savedInstanceState) {[...]mPlayerView = findViewById(R.id.exo_play_view);
}

3、 创建播放器SimpleExoPlayer实例

SimpleExoPlayer是ExoPlayer接口的一个默认的通用实现。

// 得到默认合适的带宽
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 创建跟踪的工厂
TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
// 创建跟踪器
DefaultTrackSelector trackSelection = new DefaultTrackSelector(factory);// 创建播放器
SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelection);// 第二种方式 传入了默认的渲染工厂(DefaultRenderersFactory),默认的轨道选择器(DefaultTrackSelector)和默认的加载控制器(DefaultLoadControl),然后把返回的播放器实例
//SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
//         new DefaultRenderersFactory(context),
//         new DefaultTrackSelector(),
//         new DefaultLoadControl());

4、准备并开始播放

// 生成数据媒体实例,通过该实例加载媒体数据
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
// 创建资源
Uri uri = Uri.parse(url);
MediaSource mediaSources = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
// 将播放器附加到view
mPlayerView.setPlayer(exoPlayer);
// 准备播放
exoPlayer.prepare(mediaSource);
// 准备好了之后自动播放,如果已经准备好了,调用该方法实现暂停、开始功能
exoPlayer.setPlayWhenReady(true);

5、释放播放器

if (null != exoPlayer) {exoPlayer.stop();exoPlayer.release();exoPlayer = null;
}

6、组合媒体资源

ExoPlayer库提供了ConcatenatingMediaSource和DynamicConcatenatingMediaSource可以用来无缝的合并播放多个媒体资源。

使用ConcatenatingMediaSource
下面的方法构建了组合的媒体文件。

/*** list是资源地址集合,可以是音频、视频等*/
private MediaSource getMediaSource(ArrayList<String> list) {DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));// 将URL组装成资源类MediaSource[] mediaSources = new MediaSource[list.size()];for (int i = 0; i < list.size(); i++) {Uri uri = Uri.parse(list.get(i));mediaSources[i] = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);}MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources);return mediaSource;
}

7、循环播放

ExoPlayer库提供了LoopingMediaSource实现循环播放。

// 单个资源循环播放 可指定loopCount循环次数
MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount);// 多个资源循环播放
MediaSource source = new ConcatenatingMediaSource(mediaSources);
MediaSource mediaSource = new LoopingMediaSource(source, loopCount);

8、监听ExoPlayer事件

// 添加事件监听
exoPlayer.addListener(listener);
// 移除事件监听
exoPlayer.removeListener(listener);private Player.DefaultEventListener listener = new Player.DefaultEventListener() {@Overridepublic void onPlayerStateChanged(boolean playWhenReady, int playbackState) {// 视频播放状态L.d("playbackState = " + playbackState + " playWhenReady = " + playWhenReady);switch (playbackState){case Player.STATE_IDLE:// 空闲break;case Player.STATE_BUFFERING:// 缓冲中break;case Player.STATE_READY:// 准备好break;case Player.STATE_ENDED:// 结束break;default:break;}}@Overridepublic void onPlayerError(ExoPlaybackException error) {// 报错switch (error.type){case ExoPlaybackException.TYPE_SOURCE:// 加载资源时出错break;case ExoPlaybackException.TYPE_RENDERER:// 渲染时出错break;case ExoPlaybackException.TYPE_UNEXPECTED:// 意外的错误break;}}
};

9、自定义界面

如果不设置的话,ExoPlayer 默认使用的播放控制界面是PlayerControlView如果完全不想使用这个控制界面,可以在布局文件里面修改

<com.google.android.exoplayer2.ui.PlayerView[...]app:use_controller="false"/>

这样控制界面就不显示了。

自定义PlayerControlView的行为

<com.google.android.exoplayer2.ui.PlayerViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"app:show_timeout="10000"app:fastforward_increment="30000"app:rewind_increment="30000"/>

上面的例子中,快进和快退都改成了30秒。控制界面自动消失时间是10秒。

自定义PlayerControlView界面的外观

你可以自定义控制界面,然后在布局文件里更改属性 controller_layout_id。

<com.google.android.exoplayer2.ui.PlayerView  android:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"app:controller_layout_id="@layout/custom_playback_control"/>
PlayerControlView通过id来识别它使用的所有UI元素。当你自定义布局文件的时候,必须保持标准元素的id,例如@id/exo_play 或 @id/exo_pause,以便让PlayerControlView有机会找到它们。

默认的PlayerControlView的控制界面是R.layout.exo_playback_control_view.xml。你也可以直接从ExoPlayer库中复制到app的res目录下面,然后做相应的更改即可。

四、结尾

基本的播放差不多已经完成了。ExoPlayer还有很多高级功能,例如

1、资源剪切 ClippingMediaSource
2、倍速播放
3、字幕
4、播放流媒体
等等等等

还没有研究,有兴趣的小伙伴可以去看看。

转载于:https://my.oschina.net/u/1251149/blog/3041401

ExoPlayer简单使用相关推荐

  1. AndroidX Media3之ExoPlayer简单使用(1)

    ExoPlayer是谷歌开源的一个应用级的音视频播放器.它提供了 Android 的 MediaPlayer API 的替代方案,用于在本地和通过 Internet 播放音频和视频.ExoPlayer ...

  2. 简单使用exoplayer播放HLS

    使用exoplayer 简单的播放HLS协议 代码如下: DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();Str ...

  3. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  4. 音视频开发(三十八):ExoPlayer 音频播放器实践

    通过上一篇的学习实践,我们了解了ExoPlayer的优缺点以及基本用法,今天我们进入ExoPlayer的音频播放实践,我们来一起实现一个简单的音频播放器. 目录 媒体播放框架MediaSession ...

  5. Android单元测试 > 整理分享

    Android单元测试 单元测试? What? 项目中为了测试某一个代码单元而写的测试代码:用于执行项目中的目标函数并验证其逻辑状态或者结果.这些代码是白盒测试,能够检测目标代码的准确性和可靠性,在打 ...

  6. 【音视频】6.MediaPlayer、ExoPlayer、ijkplayer简单对比

    MediaPlayer Android原生播放器,支持格式较少:支持mp4,3gp,资源文下支持mkv,使用比较简单,但是拓展性比较差.不需要集成第三方库,不占用apk体积. ijkplayer 哔哩 ...

  7. Android中视频播放器的选择,MediaPlayer、ExoPlayer、ijkplayer简单对比

    MediaPlayer 在Android系统中对于视频播放器有原生的实现MediaPlayer, 以及将MediaPlayer,SurfaceView封装在一起的VideoView, 两者都只是使用硬 ...

  8. android ijkplayer使用_Ijkplayer、ExoPlayer、VLC播放器综合比较

    VLC Media Player VLC 是VideoLAN 计划所研发的工程,最早预1996年开始,是一个完全的跨平台播放器,适合Windows.Mac OS.Linux.Android.iOS等系 ...

  9. 【翻译】安卓新播放器EXOplayer介绍

    [翻译]安卓新播放器EXOplayer介绍 http://developer.android.com/guide/topics/media/exoplayer.html 前言: Playing vid ...

最新文章

  1. PyTorch官方教程大更新:增加标签索引,更加新手友好
  2. 萌新的Linux的学习之路(十) --ip设置管理
  3. 本人的博客只是工作期间随手记录的笔记而已,所以不会很详尽,由此给您带来的不便,恳请多多包涵~...
  4. shell查询年月日(可以作为crontab判断年月日)
  5. SpringMVC @Transactional注解方式事务失效的解决办法
  6. 手把手教你如何在安卓平台上实现打电话发短信的功能
  7. ubuntu php mysql apache_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)(转)
  8. 比亚迪:华为的手机,我们造的
  9. Python学习二:词典基础详解
  10. 别乎略安身立命的基础本领
  11. Nginx+uwsgi+Django项目部署后,url长度限制修改
  12. MySQL表数据导入导出
  13. 服务器w7系统怎么开启端口,win7如何打开21端口|win7开启21端口的方法
  14. 阿里巴巴达摩院:自然语言处理技术有哪些进展和趋势?
  15. 结构化、半结构化和非结构化数据
  16. 【lua编程 控制手机进行聊天】--用于养号、可以放下手进行自动化聊天养号了
  17. 关注流浪猫:从我们出发
  18. 弘辽科技:不拼低价,95后小伙3个月从0冲上150万
  19. 极客日报第 31 期:编写贩卖《和平精英》游戏外挂,5人被判刑;苹果推出轻App码
  20. WIN10共享打印机报错解决方法

热门文章

  1. 全球及中国甲苯甲酸行业投资决策与运营前景状况分析报告2022版
  2. 中国茶叶行业投资策略分析预测及发展发展规划咨询报告2022年版
  3. VC6解决托盘菜单不消失
  4. 九 configparser模块
  5. (拿来主义-8) Spring Boot属性配置文件详解(三)
  6. 每天学习一点,坚持学习!!
  7. MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
  8. Git学习笔记05--git stash
  9. 滴滴产品总监:如何合理设计弹窗以保证流畅的用户体验?
  10. 对不起!今天我们的活动在朋友圈刷屏了……(多图预警)