最近单位项目不太忙,决定写个Demo实现一个自己的本地视频播放器,界面参考了完美视频播放器
本地视频播放器 架构简单,功能简单 MVVM+kotlin+exoplayer实现 当前实现点:
- 扫描本地视频并以文件夹(视频列表)形式显示
- 针对视频功能:单视频循环,目录循环播放,支持截图与变速,支持快进,快退支持全屏与填充两种方式
- 看一下实现效果图
- 以Demo主要是业余时间想练习一下kotlin的使用
-
发一下主要代码:
获取本地视频:
/**
* 获取本机视频列表
* @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
代码下载地址:代码地址
本来还想再弄弄,但是时间不够用,先以工作为主吧,在工作中进步