初识ExoPlayer
ExoPlayer是Google推出的一种多媒体播放器框架,支持本地音视频的播放,同时网络视频也是支持的。
快速上手
首先,把ExoPlayer的库导进来。注意,这里使用的ExoPlayer版本是2.16.1,其他版本在初始化ExoPlayer上会略有区别,大家可以参看说明文档。
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
...
//exoplayer
implementation 'com.google.android.exoplayer:exoplayer:2.16.1'
}
导入库之后我们需要了解两个模块,一是ExoPlayer,视频的加载、播放、暂停等一系列操作就是由它来完成的,也就是说ExoPlayer是音视频播放的控制器。二是StyledPlayerView,视频播放总得显示在某个控件上,而StyledPlayerView就是负责这项工作的。
接下来,定义一个ExoPlayer和StyledPlayerView,并初始化它们。
private ExoPlayer mPlayer;
private StyledPlayerView mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlayer = new ExoPlayer.Builder(this.getApplication()).build();
mVideoView = findViewById(R.id.videoView);
mVideoView.setPlayer(mPlayer);
}
接下来,准备好视频,URL可以是本地的视频地址也可以是网络视频地址。测试用的mp4可以在这里找到。
public void onPlayClicked(View view) {
if(!mPlayer.isLoading()){
MediaItem mediaItem = MediaItem.fromUri("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
mPlayer.setMediaItem(mediaItem);
mPlayer.prepare();
}
mPlayer.play();
}
public void onPauseClicked(View view) {
mPlayer.pause();
}
由于涉及到网络请求和本地文件访问,所以还需要加上权限。高版本的Android可能还会出现请求失败的问题,可以参看这篇文章
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
...
android:usesCleartextTraffic="true">
当设备跳到其他App页面或Home页面时,需要把暂停播放的视频。
@Override
protected void onPause() {
super.onPause();
mPlayer.pause();
}
页面退出时记得释放资源,否则可能引起内存泄漏。
@Override
protected void onDestroy() {
super.onDestroy();
mPlayer.release();
}
添加监听
如果需要监听播放器的状态,只需添加Listener即可。Listener接口包含了非常多的方法,其中最常用的就是 onPlaybackStateChanged 和 onIsPlayingChanged。
mPlayer.addListener(new Player.Listener() {
@Override
public void onPlaybackStateChanged(int playbackState) {
switch(playbackState){
//加载缓存且还未准备好时触发
case Player.STATE_BUFFERING:
Toast.makeText(MainActivity.this, "buffering", Toast.LENGTH_SHORT).show();
break;
//视频准备完毕时触发
case Player.STATE_READY:
Toast.makeText(MainActivity.this, "ready", Toast.LENGTH_SHORT).show();
break;
//视频播放结束时触发
case Player.STATE_ENDED:
Toast.makeText(MainActivity.this, "finished", Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void onIsPlayingChanged(boolean isPlaying) {
//播放状态改变时触发
if(isPlaying){
Toast.makeText(MainActivity.this, "play", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "pause", Toast.LENGTH_SHORT).show();
}
}
});
最后
本篇讲述了ExoPlayer的上手教程,下一篇讲述ExoPlayer播放列表的常用功能。
文章评论