mpv 如何通过 Jetpack Compose 获得现代 Android 界面

如果你曾在 Android 上尝试观看体积较大的视频文件配合复杂字幕,你可能接触过 mpv-android。它的引擎功能丰富且速度快,底层运行着久经考验的 libmpv 库。但这个经典客户端的界面长期以来都比较简陋,仿佛停留在 Android 7 时代。
最近,一个名为 mpvEx(mpvExtended)的分支在 GitHub 上获得了关注。开发者以 mpvKt 和 mpv-android 项目的代码库为基础,使用 Jetpack Compose 和 Material 3 Expressive 重写了界面,并添加了大量日常观看的实用功能。
为什么还要另一个 mpv 分支
原版播放器在极简主义方面表现出色,但移动端用户往往缺乏基本的便利性。在 mpvEx 中,作者专注于三个方面:保留 libmpv 的渲染能力、实现 UI 现代化,以及完善对家庭服务器的支持。
该应用没有广告、追踪器或在清单中声明不必要的权限。代码完全开源,采用 Apache 2.0 许可证。
这款播放器在实际使用中有哪些亮点
开箱即用的网络协议支持
通过第三方文件管理器拉取局域网中的视频文件很不方便。mpvEx 内置支持 SMB、FTP 和 WebDAV 协议。你可以直接在播放器中连接家庭 NAS 或路由器硬盘,无需先将视频下载到手机内部存储。
完整的逐帧导航功能
对于需要逐帧分析视频或在录像中寻找特定时刻的用户,提供了专门的逐帧导航界面。只需按下按钮即可向前或向后逐帧切换,没有缓冲延迟。
灵活的媒体处理
除了熟悉的画中画(PiP)模式和屏幕关闭时的后台音频播放外,该播放器还能:
- 挂载外部字幕轨道和音频文件
- 通过双指缩放手势缩放视频
- 在文件夹树状视图和平铺列表之间切换目录视图
- 管理播放列表和章节导航
底层技术架构
该项目使用 Kotlin 编写,并大量使用 Jetpack Compose。通过 JNI 实现了与原生层 libmpv 和 FFmpeg 库的集成。
构建该应用需要 JDK 17 和 Android SDK(build tools 版本 34.0.0 或更高)。仓库中配置了 GitHub Actions 流水线,可自动为不同架构构建 APK:
arm64-v8a适用于现代智能手机armeabi-v7a适用于老旧的 32 位芯片x86和x86_64适用于模拟器和罕见的 Intel 设备universal通用包,包含所有库
如果你想使用自己的签名从源码构建应用,仓库中描述了通过 GitHub Secrets 传递密钥的流程:
# Для Linux и macOS кодируем keystore в base64
base64 -i your-keystore.jks | tr -d '\n' > keystore.txt
在 Windows PowerShell 中,这使用了内置的 .NET 方法:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("your-keystore.jks")) | Out-File -FilePath keystore.txt -NoNewline
当前状态与总结
该项目正在积极开发中:仓库已获得超过 2400 颗星,但跟踪器中仍有约 250 个未解决的问题。开发者坦诚地警告说,在非标准场景下可能会出现 bug。
如果你觉得 VLC 等标准播放器过于臃肿,而简陋的 mpv-android 又让你望而却步,mpvEx 将是一个绝佳的替代选择。你可以从 GitHub 的 releases 页面或通过 IzzyOnDroid 目录下载现成的构建版本。对于 Android 开发者来说,该仓库也是一个很好的示例,展示了如何用现代 Compose UI 封装重型 C/C++ 库。
相关项目