天天看點

關于Exoplayer的學習和初步使用前言

前言

本篇博文主要是對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播放視訊

第一步:

  1. 添加依賴
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

可參考資料:官方文檔

qing的世界相關文章

一款基于ExoPlayer的自定義播放器

實踐中遇到的問題(僅供參考):

關于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)
    }