Using cache in ExoPlayer

后端 未结 10 2192
暖寄归人
暖寄归人 2020-11-29 18:29

I\'m looking for any example of implementing cache in ExoPlayer.

ExoPlayer has in its library different classes concerning cache and Google explain in this video th

10条回答
  •  暖寄归人
    2020-11-29 18:34

    Here's my sample in Kotlin (project available here) :

    class MainActivity : AppCompatActivity() {
        private var player: SimpleExoPlayer? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            if (cache == null) {
                cache = SimpleCache(File(cacheDir, "media"), LeastRecentlyUsedCacheEvictor(MAX_PREVIEW_CACHE_SIZE_IN_BYTES))
            }
            setContentView(R.layout.activity_main)
        }
    
        override fun onStart() {
            super.onStart()
            playVideo()
        }
    
        private fun playVideo() {
            player = ExoPlayerFactory.newSimpleInstance(this@MainActivity, DefaultTrackSelector())
            playerView.player = player
            player!!.volume = 1f
            player!!.playWhenReady = true
            player!!.repeatMode = Player.REPEAT_MODE_ALL
            player!!.playVideoFromUrl(this, "https://sample-videos.com/video123/mkv/240/big_buck_bunny_240p_20mb.mkv", cache!!)
    //        player!!.playVideoFromUrl(this, "https://sample-videos.com/video123/mkv/720/big_buck_bunny_720p_1mb.mkv", cache!!)
    //        player!!.playVideoFromUrl(this, "https://sample-videos.com/video123/mkv/720/big_buck_bunny_720p_1mb.mkv")
    //        player!!.playRawVideo(this,R.raw.videoplayback)
        }
    
        override fun onStop() {
            super.onStop()
            playerView.player = null
            player!!.release()
            player = null
        }
    
        companion object {
            const val MAX_PREVIEW_CACHE_SIZE_IN_BYTES = 20L * 1024L * 1024L
            var cache: com.google.android.exoplayer2.upstream.cache.Cache? = null
    
            @JvmStatic
            fun getUserAgent(context: Context): String {
                val packageManager = context.packageManager
                val info = packageManager.getPackageInfo(context.packageName, 0)
                val appName = info.applicationInfo.loadLabel(packageManager).toString()
                return Util.getUserAgent(context, appName)
            }
        }
    
        fun SimpleExoPlayer.playRawVideo(context: Context, @RawRes rawVideoRes: Int) {
            val dataSpec = DataSpec(RawResourceDataSource.buildRawResourceUri(rawVideoRes))
            val rawResourceDataSource = RawResourceDataSource(context)
            rawResourceDataSource.open(dataSpec)
            val factory: DataSource.Factory = DataSource.Factory { rawResourceDataSource }
            prepare(LoopingMediaSource(ExtractorMediaSource.Factory(factory).createMediaSource(rawResourceDataSource.uri)))
        }
    
        fun SimpleExoPlayer.playVideoFromUrl(context: Context, url: String, cache: Cache? = null) = playVideoFromUri(context, Uri.parse(url), cache)
    
        fun SimpleExoPlayer.playVideoFile(context: Context, file: File) = playVideoFromUri(context, Uri.fromFile(file))
    
        fun SimpleExoPlayer.playVideoFromUri(context: Context, uri: Uri, cache: Cache? = null) {
            val factory = if (cache != null)
                CacheDataSourceFactory(cache, DefaultHttpDataSourceFactory(getUserAgent(context)))
            else
                DefaultDataSourceFactory(context, MainActivity.getUserAgent(context))
            val mediaSource = ExtractorMediaSource.Factory(factory).createMediaSource(uri)
            prepare(mediaSource)
        }
    }
    

提交回复
热议问题