前言
本篇博文主要是對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
-
:支援DASH内容exoplayer-dash
-
:支援HLS内容exoplayer-hls
-
:支援SmoothStreaming内容exoplayer-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
可參考資料:官方文檔
qing的世界相關文章
一款基于ExoPlayer的自定義播放器
實踐中遇到的問題(僅供參考):
解決方案:
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)
}