前言
本篇博文主要是对EXOPlayer的使用做简单概述,以及使用心得。
优点和缺点
与 android 内置的 mediaplayer 相比, exoplayer 具有许多优势:
- 支持通过 http (dash) 和平滑流进行动态自适应流, 这两者都不受 mediacplayer 的支持。还支持许多其他格式。
- 支持高级 hls 功能, 例如正确处理
#EXT-X-DISCONTINUITY
标签。 - 无缝合并、连接和循环媒体的能力。
- 与您的应用程序一起更新播放器的能力。因为 exoplayer 是一个包含在应用程序 apk 中的库, 所以您可以控制所使用的版本, 并且可以轻松地更新到较新的版本, 作为常规应用程序更新的一部分。
- 更少的设备特定的问题和更少的行为变化, 在不同的设备和版本的 android。
- 支持 android 4.4 (api 级别 19) 及更高版本上的 widevine 常见加密。
- 自定义和扩展播放器以适合您的用例的能力。exoplayer 是专门考虑到这一点而设计的, 它允许将许多组件替换为自定义实现。
- 能够使用官方扩展快速与其他一些库集成。
需要注意的是, 也有一些缺点:
- 对于某些设备上的音频播放, exoplayer 可能会在电量消耗上比 media-playp 更多。
使用ExoPlayer播放视频
第一步:
- 添加依赖
implementation 'com.google.android.exoplayer:exoplayer:2.X.X'
也可以:
implementation 'com.google.android.exoplayer:exoplayer:+'
为了省事,我们依赖了整个ExoPlayer库。你也可以只依赖你真正需要的库。例如果你要播放DASH类型的媒体资源,你可以只依赖Core
,DASH
,UI
这三个库。
implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
implementation 'com.google.android.exoplayer:exoplayer-dash: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组件和相关的资源。
第二步:添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
第三步:构建布局
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
第四步:代码实现(简单实现)
private fun initEXO() {
/**创建一个SimpleExoPlayer实例,使用的是默认实现*/
if (player == null)
player = ExoPlayerFactory.newSimpleInstance(this,
DefaultRenderersFactory(this),
DefaultTrackSelector(),
DefaultLoadControl())
/**绑定view*/
playerview.player = player
/**视频地址*/
val uri = Uri.parse("https://keba-app-input.oss-cn-beijing.aliyuncs.com/20181106%2F8LgSACxi.mp4")
val bandwidthMeter = DefaultBandwidthMeter()
/**exoplayertest 为applicationName
* bandwidthMeter可设置为null
* */
val dataSouceFactory = DefaultDataSourceFactory(this,Util.getUserAgent(this,
"exoplayertest"),bandwidthMeter)
val extractorsFactory = DefaultExtractorsFactory()
/**创建一个MediaSource*/
val videoSource = ExtractorMediaSource(uri,dataSouceFactory,extractorsFactory,
null,null)
/**执行播放*/
player?.prepare(videoSource)
}
总结:持续研读源码ing
可参考资料:官方文档
实践中遇到的问题(仅供参考):
解决方案:
defaultConfig { ... multiDexEnabled true }
android { ... compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } }
implementation 'com.android.support:multidex:1.0.1'
在Application中:MultiDex.install(this)
或者实现:override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}