谷歌官方推荐的ExoPlayer的基本使用
简介
在日常开发中,自然少不了使用播放器,特别是现在短视频流行的情况下,几乎所有的App都有播放视频的功能,一提到播放器,相信很多开发者都知道GSYPlayer和IjkPlayer。这两款开源的播放器功能强大,能满足日常开发需要。但是需要引入第三方依赖,加载一些很多不必要的资源,我们现在的App由于历史原因还有很多不同的播放器,导致包体积直线上升。
使用过GSYPlayer的小伙伴都知道,这个播放器是支持切换内核的。一个是ijkPlayer内核和一个ExoPlayer的内核。其实认真了解ExoPlayer的小伙伴都知道,使用ExoPlayer更简单,更方便。毕竟 谷歌出品,必属精品!下面我们就来介绍一下怎么使用ExoPlayer?
基本使用
ExoPlayer最新版本是media3,这里使用的版本较低,主要是因为主线App的targetSDK版本是30,一旦超过了2.15.1就必须升级Android SDK版本。话不多说,直接上代码。
引入依赖
1
| implementation 'com.google.android.exoplayer:exoplayer:2.15.1'
|
创建ExoPlayer
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| val loadControl = DefaultLoadControl.Builder() .setPrioritizeTimeOverSizeThresholds(true) .setBufferDurationsMs(MIN_BUFFER_MS, MAX_BUFFER_MS, PLAYBACK_BUFFER_MS, REBUFFER_MS) .build() if (mPlayer == null){ mPlayer = activity?.let { SimpleExoPlayer.Builder(activity).setLoadControl(loadControl).build() } } mPlayer?.repeatMode = Player.REPEAT_MODE_ALL mPlayer?.setSeekParameters(SeekParameters.EXACT) mPlayer?.setVideoFrameMetadataListener(this) mPlayer?.addListener(this)
|
设置视频资源
1 2 3 4 5 6 7 8 9
| list.forEach { val newMediaItem = MediaItem.Builder() .setUri(it.path) .build() mPlayer?.addMediaItem(newMediaItem) }
mPlayer?.playWhenReady = true mPlayer?.prepare()
|
播放视频
暂停视频
停止播放
绑定Surface/SurfaceView/TextureView
1 2 3 4 5 6
| mPlayer?.setVideoSurface(surface)
mPlayer?.setVideoSurfaceView(surfaceView)
mPlayer?.setVideoSurfaceView(textureView)
|
seekTo
1 2 3 4
| mPlayer?.seekTo(time)
mPlayer?.seekTo(currentIndex,time)
|
指定区间播放
1 2 3 4 5
| MediaItem.Builder() .setUri(it.path) .setClipStartPositionMs(it.imageStartTime) .setClipEndPositionMs(it.imageEndTime) .build()
|
优点:使用简单,谷歌出品,懂得都懂。最低支持API 14,支持的格式丰富。
缺点:需要自己计算视频播放进度。
总结
ExoPlayer不仅支持单个视频播放,也支持视频列表播放,切换下一个视频和指定时间段播放视频等丰富的功能。ExoPlayer还提供了UI框架,小编这里使用surface是因为需要自定义渲染效果。
小编在使用过程中踩了很多坑,如果读者在使用ExoPlayer的过程中,遇到无法解决的问题可以私信小编。