关于Exoplayer的学习和初步使用

时间:2024-03-23 07:50:52

前言

本篇博文主要是对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)
    }