当前位置:   article > 正文

ExoPlayer简单使用

simpleexoplayer 循环播放

一、介绍

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这两个个库。

  1. implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
  2. 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
  1. <com.google.android.exoplayer2.ui.PlayerView
  2. android:id="@+id/exo_play_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" />
  1. private PlayerView mPlayerView;
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. [...]
  5. mPlayerView = findViewById(R.id.exo_play_view);
  6. }
3、 创建播放器SimpleExoPlayer实例
SimpleExoPlayer是ExoPlayer接口的一个默认的通用实现。
  1. // 得到默认合适的带宽
  2. BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
  3. // 创建跟踪的工厂
  4. TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
  5. // 创建跟踪器
  6. DefaultTrackSelector trackSelection = new DefaultTrackSelector(factory);
  7. // 创建播放器
  8. SimpleExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelection);
  9. // 第二种方式 传入了默认的渲染工厂(DefaultRenderersFactory),默认的轨道选择器(DefaultTrackSelector)和默认的加载控制器(DefaultLoadControl),然后把返回的播放器实例
  10. //SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(
  11. // new DefaultRenderersFactory(context),
  12. // new DefaultTrackSelector(),
  13. // new DefaultLoadControl());
4、准备并开始播放
  1. // 生成数据媒体实例,通过该实例加载媒体数据
  2. DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "exoplayerdemo"));
  3. // 创建资源
  4. Uri uri = Uri.parse(url);
  5. MediaSource mediaSources = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
  6. // 将播放器附加到view
  7. mPlayerView.setPlayer(exoPlayer);
  8. // 准备播放
  9. exoPlayer.prepare(mediaSource);
  10. // 准备好了之后自动播放,如果已经准备好了,调用该方法实现暂停、开始功能
  11. exoPlayer.setPlayWhenReady(true);
5、释放播放器
  1. if (null != exoPlayer) {
  2. exoPlayer.stop();
  3. exoPlayer.release();
  4. exoPlayer = null;
  5. }
6、组合媒体资源

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

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

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

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

  1. // 单个资源循环播放 可指定loopCount循环次数
  2. MediaSource source = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
  3. MediaSource mediaSource = new LoopingMediaSource(source, loopCount);
  4. // 多个资源循环播放
  5. MediaSource source = new ConcatenatingMediaSource(mediaSources);
  6. MediaSource mediaSource = new LoopingMediaSource(source, loopCount);
8、监听ExoPlayer事件
  1. // 添加事件监听
  2. exoPlayer.addListener(listener);
  3. // 移除事件监听
  4. exoPlayer.removeListener(listener);
  5. private Player.DefaultEventListener listener = new Player.DefaultEventListener() {
  6. @Override
  7. public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
  8. // 视频播放状态
  9. L.d("playbackState = " + playbackState + " playWhenReady = " + playWhenReady);
  10. switch (playbackState){
  11. case Player.STATE_IDLE:
  12. // 空闲
  13. break;
  14. case Player.STATE_BUFFERING:
  15. // 缓冲中
  16. break;
  17. case Player.STATE_READY:
  18. // 准备好
  19. break;
  20. case Player.STATE_ENDED:
  21. // 结束
  22. break;
  23. default:
  24. break;
  25. }
  26. }
  27. @Override
  28. public void onPlayerError(ExoPlaybackException error) {
  29. // 报错
  30. switch (error.type){
  31. case ExoPlaybackException.TYPE_SOURCE:
  32. // 加载资源时出错
  33. break;
  34. case ExoPlaybackException.TYPE_RENDERER:
  35. // 渲染时出错
  36. break;
  37. case ExoPlaybackException.TYPE_UNEXPECTED:
  38. // 意外的错误
  39. break;
  40. }
  41. }
  42. };
9、自定义界面

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

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

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

自定义PlayerControlView的行为

  1. <com.google.android.exoplayer2.ui.PlayerView
  2. android:id="@+id/video_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. app:show_timeout="10000"
  6. app:fastforward_increment="30000"
  7. app:rewind_increment="30000"/>

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

自定义PlayerControlView界面的外观

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

  1. <com.google.android.exoplayer2.ui.PlayerView
  2. android:id="@+id/video_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. 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. 1、资源剪切 ClippingMediaSource
  2. 2、倍速播放
  3. 3、字幕
  4. 4、播放流媒体
  5. 等等等等

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/299298
推荐阅读
相关标签
  

闽ICP备14008679号