freader-media-player(FMP Player),一个使用 flutter 开发的简单的本地媒体播放器,用于播放本地音频,浏览本地图片,观看本地视频。
额外添加了“2048”和“俄罗斯方块”小游戏,做到“视听娱乐”不耽误。
- 本地音乐
- 拥有
全部
、歌单
、歌手
、专辑
的模块分类,每个模块都可自主关键字查询、调整排序; - 可以后台播放,状态栏有显示歌曲名称。
- 拥有
- 全部资源
- 默认扫描设备中的所有音频、视频、图片等媒体文件所在路径,可分类筛选和资源文件关键字模糊查询;
- 文件夹可以切换网格显示或列表显示。
- 点击某一个文件夹后可显示对应筛选结果的媒体资源列表,也可切换网格或列表显示;
- 再点击指定文件夹中指定资源之后,可以进行预览或者播放:
- 如果点击的是图片文件,可左右滑动查看该文件夹下所有图片,并提供双指缩放等功能;
- 如果点击的是音频文件,默认该文件夹下所有音频文件都加入当前播放列表,和“本地音乐”模块共用播放;
- 区别在于:“本地音乐”播放的音乐会在退出 app 后保留上次播放的列表和音乐,“全部资源”模块不会。
- 如果点击的是视频文件,默认该文件夹下所有视频文件都加入当前播放列表,视频播放器会自动连播。
- 此外,视频播放器有上一个、暂停、下一个、全屏、关闭,上下滑动屏幕左侧调节应用亮度、上下滑动屏幕右侧调节系统音量、左上角显示视频名称,等功能。
- 播放器默认根据视频是横屏或竖屏进行播放。
- 默认扫描设备中的所有音频、视频、图片等媒体文件所在路径,可分类筛选和资源文件关键字模糊查询;
- 休闲游戏
- 提供“2048”和“俄罗斯方块”小游戏,会本地持久化缓存最高得分。
- 2048 游戏在退出后也会保留当前状态,重新打开如果没有结束还可以继续。
- 提供“2048”和“俄罗斯方块”小游戏,会本地持久化缓存最高得分。
由于权限管控越发严格,本地资源均不再提供任何异动(例如重命名、复制、删除等)功能
开发环境:
- 在 Windows7 主机下使用 VirtualBox7.0 安装的 Ubuntu22.04 虚拟机,配合 VS Code1.85.2 进行开发;
- flutter 版本为 3.16.7,java 版本为 Temurin-11.0.18+10
仅在下面设备进行过实机测试,其他平台完全没处理:
- Nubia Z50 Ultra (Android 13 , 分辨率
2480 * 1116
,游戏页面显示不算好看) - xiaomi 6 (Android 9 , 分辨率
1920 * 1080
)
粗略截图如下:
- feat:添加了扫雷小游戏
- 更多参看对应模块的 readme 。
- feat:添加了俄罗斯方块小游戏
- 更多参看对应模块的 readme 。
- feat:添加了 2048 小游戏
- 更多参看对应模块的 readme 。
- 添加了休闲游戏模块后,原本的“本地图片”和“本地视频”模块就初始默认隐藏,同样长按退出弹窗正文可切换。
- feat:
- 将媒体资源模块拆分为“本地视频”和“本地图片”,可分文件夹预览所有的视频或图片资源。
- 添加了媒体资源整合管理的“全部资源”模块,可条件查询、分类型展示。图片、视频、音频点击后调用各自播放器播放或预览。
- 添加了视频播放时左边上下滑动屏幕调整应用内亮度、右边上下滑动屏幕调整系统音量的功能。可原分辨率和全屏播放视频。
- deprecated:
- 因为实测
photo_namager
中PhotoManager.getAssetPathList()
条件查询时,使用AdvancedCustomFilter/ CustomFilter
的 filter 和 type 中指定RequestType
不能同时生效(始终是全部类型的资源),所以“本地视频”和“本地图片”默认显示所有,不可筛选。 - 因为对文件操作的安全性要求越来越严格,不再继续添加对媒体文件的异动操作(比如重命名、复制、删除等)
- 因为实测
- fix:修复了一些小 bug。
- perf:清除大量无用的测试、打印等代码,清理一些原本预留的功能但后续不做的模块。
- bonus:添加长按退出弹窗的正文,可切换底部导航栏显示的数量(可隐藏“本地图片”和“本地视频”模块,因为功能基本和“全部资源重复”)。
- warning:
- 实测,使用 Windows7 系统自带的演示范例视频
Wildlife.wmv
会有很多问题:- 这个
photo_manager
库基本无法正常解析(可以判断出是个视频,但无法生成缩略图,无法识别出视频长度等等内容,还会输出一堆报错); - 因此直接
AssetEntity
获取的file
也就无法使用video_player
进行正常播放了。
- 这个
- 没有测试过视频分辨率大于设备分辨率的视频播放。
- 在 Nubia Z50 Ultra (分辨率
2480 * 1116
)、xiaomi6(分辨率1920 * 1080
)下进行实机测试,app 正常使用。- 但是如果是
flutter run -v
运行本项目,前者在 Android 13 时正常,升级到 Android 14 后,运行项目会卡住在Waiting for VM Service port to be available...
,目前还没有搜索到类似出现的原因。
- 但是如果是
- “本地音乐”模块在退出后重新打开 app 保留上次播放的列表和音乐时,第一次或者第二次时不对,多几次后面是正常的,原因不明,不是很影响使用,后续有空再继续查看。
- 实测,使用 Windows7 系统自带的演示范例视频
- 添加了后台播放时通知栏可显示音频缩略图;
- 修正了记录上次播放歌单和歌曲功能未生效的问题;
- 简单重构了本地音乐模块,清除大量无用和无意义的输出、预留功能等代码;
- 升级 flutter 环境为 3.16.7,相关组件库依赖也升级为可用的最新版本;
- 在 Nubia Z50 Ultra 下进行实机测试(Android 13 , 分辨率
2480 * 1116
)。
是之前的练手项目freader的衍生。
主要项目结构:
├── lib
├── common
├── layout
├── models
├── services
├── views
└── main.dart
主要使用的插件库:
- on_audio_query: ^2.9.0
- just_audio: ^0.9.36
- just_audio_background: ^0.0.1-beta.11
- audio_session: ^0.1.18
- get_it: ^7.6.6
- provider: ^6.1.1
- marquee: ^2.2.3
- permission_handler: ^11.1.0
- path_provider: ^2.1.2
- video_player: ^2.8.2
- flick_video_player: ^0.7.0
- photo_manager: ^3.0.0-dev.5
- photo_view: ^0.14.0
- get_storage: ^2.1.1
- screen_brightness: ^0.2.2+1
- flutter_volume_controller: ^1.3.1
- flutter_riverpod: ^2.4.9
- flutter_swipe_detector: ^2.0.0
- soundpool: ^2.4.1
- ……
- 使用的组件相关
- on_audio_query: ^2.9.0
- 从 2.7.0 版本开始使用,插件的修改歌单名称
renamePlaylist()
方法报错,堆栈溢出,暂时无解 queryPlaylists()
中的音频 id 与原始音频 id 不一致,无法直接获取原始音频的图片等信息- 目前是通过音频名称查询得到该音频原始信息,再使用其图片。
queryWithFilters()
接口 查询 playlist 的时候有 bug,没有numOfSongs
属性。所以转为 PlaylistModel 会报错。- 目前是转为 map,取得
_id
属性,再使用 queryAudiosFrom 从 playlist 中查询拥有的音频数量,再手动构建num_of_songs
属性,然后再转为 PlaylistModel 类型。
- 目前是转为 map,取得
- 从 2.7.0 版本开始使用,插件的修改歌单名称
- photo_manager: ^3.0.0-dev.5
- 在配合photo_view使用时,
PhotoViewGallery.builder()
的PhotoViewGalleryPageOptions()
的imageProvider
属性需要是ImageProvider
类型,但 photo_manager 取得的文件资源 AssetEntity 的 file 属性是一个Future<File?>
。 - 在使用
PhotoManager.getAssetPathList()
条件查询时,如果filterOption
参数直接使用它的高级查询 AdvancedCustomFilter/CustomFilter ,那么同时设定type
参数不会生效。
- 在配合photo_view使用时,
- photo_manager 和 flick_video_player/video_player
- 如果视频是 Windows7 系统自动的那个范例视频
野生生物.wmv
(Wildlife.wmv),不仅无法生成缩略图,也无法播放。- photo_manager 能识别出来是个视频,但是无法解析任何相关信息
- video_player 无法识别,所以不能播放。
- 但是,这两个插件会报一大堆错误,然后你无法处理
- 如果视频是 Windows7 系统自动的那个范例视频
- 我是最近才知道 flutter_riverpod,所以和 provider 同时存在了两个状态管理组件,推荐统一为前者,但先就这样。
- on_audio_query: ^2.9.0
- 能力水平相关:
- 本地音乐中
音频列表
长按后显示加入歌单
、查看信息
等按钮,但其实长按后每次点击都重新渲染了列表组件。 - 理论上“本地音乐”在每一首歌播放前都会记录当前的歌单和音乐,但是首次或者前几次使用此 app 时,无法正确记录该值。多几次就正常了。
- 因为不是很影响使用,虽然不明白为什么,也没有去处理。
- 在手机升级到 Android14 后,
flutter run -v
启动卡在 Waiting for VM Service port to be available...,就无法热加载或其他操作,原因不明。
- 本地音乐中
- 以及其他使用 flutter 经验不足或能力不足的各种问题。