一个kotlin实现的视频播放器

本文章就kotlin实现的一个视频播放器做一个讲解。

技术栈:MVVM+Kotlin

UI:SurfaceView+Recyclerview

一 .加载流程:

(1)数据获取:

进入主页面->权限获取(动态读写权限)->遍历手机文件夹->获取mp4文件路径集合->返回给到主页面->RecyclerView列表加载

(2)播放流程

点击播放列表(上下曲)->获取当前媒体url->MediaPlayer进行播放

点击播放(暂停)->MediaPlayer设置播放(暂停)

点击循环模式->播放模式字段设置->url根据字段调整

二.代码流程(媒体url集合获取):

数据获取:MainActivity->MainViewModel->MainModel->VideoFileTask

UI展示:VideoTask->MainViewModel->MainActivity->RecyclerView

详细:

MainActivity获取MainViewModel对象

Kotlin 复制代码
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

MainActivity监听数据回调

Kotlin 复制代码
mainViewModel.mainData.observe(this, Observer {
            refreshData(it)
        })

MainActivity主动获取媒体url集合代码流程

Kotlin 复制代码
//获取权限后,去遍历文件夹获取url集合
override fun hasFilePermission(hasPerssion: Boolean) {
        when (hasPerssion) {
            true -> mainViewModel.scanFile()
            false -> "no permission"
        }
    }

//MainViewModel层调用MainModel层遍历文件方法
  override fun scanFile() {
        mainModel.scanFile {
            mainModel.initPosition(0, it)//设置播放初始位置,初始化遍历获取的url集合
            mainData.postValue(transToCurrentNeedData(it))//url集合返回给到            MainActivity
        }
    }

//MainModel层方法,单例调用VideoFileTask方法
 fun scanFile(onVideoListCallback: (MutableList<String>) -> Unit) {
        VideoFileTask.getVideoFileTask()?.findMusicFile(onVideoListCallback)
    }

//VideoFileTask层方法,创建协程,遍历文件夹获取url集合

  /**
     * 查找本地媒体文件
     */
    fun findVideoFile(onVideoListCallback: (MutableList<String>) -> Unit) {
        val rootUrl: String = Environment.getExternalStorageDirectory().path   
        val rootFile: File = File(rootUrl)
        mainScope.launch(Dispatchers.Main) {
            onVideoListCallback(withContext(Dispatchers.IO) {
                videos.clear()
                loopFile(rootFile)
                videos
            })
        }

    }


 /**
     * 循环遍历文件夹获取文件后缀为.mp4的文件
     */
    private fun loopFile(file: File) {
        val files = file.listFiles()
        if (files != null) {
            files.forEach {
                if (it.isDirectory) {
                    loopFile(it)
                } else {
                    if (it.path.contains(".mp4")) {
                        videos.add(it.path)
                    }
                }
            }
        }
    }

(三)播放控制代码流程(只讲播放逻辑,其他类似)

Kotlin 复制代码
//MainActivity主页面点击播放列表
    private fun listenAdapterClick() {
        mediaAdapter.listenMusicClick { url: String, position: Int ->
            visibleBottomBarOnce()//ui处理,显示底部栏
            mainViewModel.mainModel.play(position)//调用播放指令
        }
    }


//MainModel层开始播放
fun play(position: Int) {
//        musicPlayer.release()
        //判断是否点击播放按钮
        if (!isInit) return
        if (position == POSITON_INIT) {
            if (!mediaPlayer.isPlaying) {
                if (isPrepared) {
                    play()
                } else {
                    play(0)
                }
            }
            return
        }

        var resultUrl = data[position]
        if (resultUrl.isEmpty()) {
            return
        }
        if (mediaPlayer.isPlaying && currentPosition == position) {
            return
        } else {
            mediaPlayer.reset()
        }
        mediaPlayer.setDataSource(resultUrl)
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
        mediaPlayer.prepareAsync()
        playPosition = position
        currentPosition = position
        onPositionCallback(position)//播放位置更新返回给ui

    }

(四)代码结构:

(五)效果

(六)上传地址(gitee)

https://gitee.com/daxiangzaici/kt-media-player.git

相关推荐
tachibana22 分钟前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者7 分钟前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
EasyGBS24 分钟前
通信基站/铁塔机房无人值守,国标GB28181公网平台EasyGBS视频能力怎么去管
深度学习·安全·音视频
鲲穹AI种草1 小时前
音频剪辑降噪格式转换,鲲穹音频处理大师实测分享
音视频·音频剪辑
imDwAaY1 小时前
MySQL 存储引擎是什么?
android·数据库·mysql
唐钰小宝B1 小时前
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
java·开发语言·windows
江节胜-胜行全栈AI2 小时前
实现海康/宇视NVR硬盘录像机/IPC摄像机监控历史回放录像rstp流视频的倍数下载
音视频
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>2 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
Meteors.2 小时前
Android Compose学习02:基础组件与 Modifier
android·学习