ExoPlayer实现本地视频播放器

本文分享了一个使用Kotlin和MVVM模式实现的本地视频播放器Demo,包括扫描本地视频、视频循环播放、截图功能以及基本控制操作。作者还展示了获取视频列表和构建ExoPlayer的关键代码段。

最近单位项目不太忙,决定写个Demo实现一个自己的本地视频播放器,界面参考了完美视频播放器

本地视频播放器 架构简单,功能简单 MVVM+kotlin+exoplayer实现 当前实现点:

  1. 扫描本地视频并以文件夹(视频列表)形式显示
  2. 针对视频功能:单视频循环,目录循环播放,支持截图与变速,支持快进,快退支持全屏与填充两种方式
  3. 看一下实现效果图
  4. 以Demo主要是业余时间想练习一下kotlin的使用
  5.  

     发一下主要代码:

        获取本地视频:

 /**
     * 获取本机视频列表
     * @return
     */
    public fun getVideoFolder(): ArrayList<Video> {
        val videos: ArrayList<Video> = ArrayList<Video>()
        var c: Cursor? = null
        try {
            c = PerfectApplication.context.getContentResolver().query(
                MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                MediaStore.Video.Media.DEFAULT_SORT_ORDER,
            )
            while (c?.moveToNext()!!) {
                val path = c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)) // 路径
                val folder = File(path).getParentFile().getName()
                // 暂时只支持了mp4格式
                var count = File(path).getParentFile().walk()
                    .maxDepth(1)
                    .filter { it.isFile }
                    .filter { it.extension in listOf("mp4", "mp3", "avi") }
                    .toList().size

                if (!FileUtils.isFileExists(path)) {
                    continue
                }
                // count显示的是第个文件夹下视频数量
                val video = Video(
                    null, false, 0, null, false, folder, null, count,
                    AlbumFragment.TYPE_NO, null,
                )

                videos.add(video)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            c?.close()
        }
        return videos
    }

    /**
     * 去重
     *
     * @param testList
     */
    @RequiresApi(Build.VERSION_CODES.N)
    public fun useSetDistinct(videoList: ArrayList<Video>): ArrayList<Video> {
        var result = videoList.stream().distinct().collect(Collectors.toList())
        return result as ArrayList<Video>
    }

构建视频播放:

 private fun initPlayer() {
        if (player == null) {
            // 1. 构建播放器实例
            player = ExoPlayer.Builder(this).build()

            playerView.player = player

            player!!.setMediaItem(MediaItem.fromUri(dataList.get(pos).path.toString()))
            player?.prepare()
            player?.repeatMode = REPEAT_MODE_OFF
        }

        // Play from the item selected on the playlist from previous activity/fragment
        // player?.seekTo(pos, C.TIME_UNSET)
        player?.addListener(PlayerEventListener())
        player?.playWhenReady = true
    }

 记录历史记录:

 init {
        if (repository == null) {
            repository = InjectorUtil.getAlbumRepository()
        }
    }
    public fun getTime(): String {
        var format = SimpleDateFormat("HH:mm")
        return TimeUtils.getNowString(format)
    }

    fun saveHistory(video: Video) {
        repository?.videoDao?.saveVideoHistory(video)
    }

感谢MVVMLin:MVVMLin

代码下载地址:代码地址 

本来还想再弄弄,但是时间不够用,先以工作为主吧,在工作中进步

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TouchOfSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值