https://github.com/google/ExoPlayer
一、ExoPlayer介绍
ExoPlayer是安卓应用级的媒体播放器,不仅支持播放本地音、视频文件,而且还能够在线播放。它提供了许多Android本身并未支持的API,在此基础上还允许开发者进行各种个性化自定义和功能扩展。
二、使用方法
ExoPlayer的使用可以主要包括以下几个步骤:
- 项目中添加ExoPlayer依赖;
- 创建ExoPlayer实例;
- 将视图与ExoPlayer绑定;
- 将媒体文件添加到ExoPlayer中播放;
- 释放ExoPlayer对象。
接着将在项目中根据这五个步骤创建一个简单的ExoPlayer播放器来播放媒体文件。
(1)项目中添加ExoPlayer依赖
(a)在app/build.gradle
中添加ExoPlayer依赖,点此获取版本号。
dependencies {
...
implementation 'com.google.android.exoplayer:exoplayer:2.10.6'
}
(b)如果没有开启Java 8,那么还需要在app/build.gradle
中添加以下代码
android {
...
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
}
(2)创建ExoPlayer实例
我们可以使用ExoPlayerFactory
来创建ExoPlayer
的实例,通过它能够创建多种具备不同定制化程度的ExoPlayer
实例。但对于大多数场景,我们只需使用ExoPlayerFactory.newSimpleInstance
类来创建ExoPlayer
实例,它继承自ExoPlayer
,并且拥有更多高级别的API。
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(context);
需要注意的是,必须从单个应用程序线程访问ExoPlayer
实例。对于绝大多数情况,这应该是应用程序的主线程(UI thread)。使用ExoPlayer的UI组件或IMA扩展时,需要使用应用程序的主线程。必须访问ExoPlayer实例的线程可以在创建播放器时通过传递Looper显式指定。如果未指定Looper,则使用创建播放器的线程的Looper,或者如果该线程没有Looper,则使用应用程序主线程的Looper。在所有情况下,都可以使用Player.getApplicationLooper查询必须从中访问播放器的线程的Looper。
(3)将视图与ExoPlayer绑定
ExoPlayer
库已经为我们提供了PlayerView
,它封装了PlayerControlView
(播放器控制视图)、Subtitle View
(字幕视图)和Surface
(渲染视图)。在activity_main.xml
文件中定义视图,使用以下方式将实图与播放器绑定:
playerView.setPlayer(player);
<!--activity_main.xml-->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.google.android.exoplayer2.ui.PlayerView>
</androidx.constraintlayout.widget.ConstraintLayout>
//MainActivity.java
public class MainActivity extends AppCompatActivity {
private SimpleExoPlayer player;
private PlayerView playerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerView = findViewById(R.id.playerView);
player = ExoPlayerFactory.newSimpleInstance(this);
playerView.setPlayer(player);
}
}
(4)将媒体文件添加到ExoPlayer中播放
在ExoPlayer
中,每个媒体都由一个MediaSource
表示。要播放媒体文件,必须首先创建相应的MediaSource
,然后将此对象传递给ExoPlayer.Prepare
。以下代码显示如何使用适合播放MP4文件的MediaSource准备播放器。
final Uri mp4VideoUri = Uri.parse("file:///android_asset/example.mp4");
Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "com.example.exoplayerdemo"));
MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mp4VideoUri);
player.prepare(videoSource);
player.setPlayWhenReady(true); //参数为`true`时播放,为`false`时停止播放
(5)控制播放器
一旦播放器准备好,就可以通过调用播放器上的方法来控制播放。例如·setPlayWhenReady
启动并暂停播放,各种seekTo
方法在媒体内查找,setRepeatMode
控制是否以及如何循环媒体,setShuffleModeEnabled
控制播放列表洗牌,setPlaybackParameters
调整播放速度和音调。如果播放器绑定到PlayerView
或PlayerControlView
,则与这些组件的用户交互将导致调用播放器上的相应方法。
(6)释放播放器
播放器不再使用时一定要记得释放资源!!!
player.release();