中文 | English
一款轻量级 Android 视频转音频工具,支持快速提取并导出为 MP3 / M4A / WAV / FLAC / OGG 格式,无广告且完全免费
-
极简视频选择 — 原生支持 Android Photo Picker,无需额外申请读写权限,安全读取设备视频。
-
多格式灵活输出 — 支持 MP3、M4A、WAV、FLAC、OGG 五种音频格式,覆盖从高兼容到无损的全场景需求。
-
智能格式推荐 — 自动检测视频内嵌音频编码,智能选中最佳输出格式(如 AAC→M4A),优先直接复制实现秒级提取。
-
极速提取 — SAF 直读跳过文件拷贝、智能流复制避免不必要转码、多线程充分利用多核性能,18 分钟视频仅需数秒。
-
实时进度展示 — 环形进度条 + 百分比读数,实时呈现提取进度,支持随时取消。
-
内置播放预览 — 基于 Media3 ExoPlayer 的流畅试听体验,支持丝滑的进度拖拽。
-
文件管理 — 支持自定义重命名,自动保存至
/Music/AudioPeel,一键打开系统文件管理器查看。 -
快捷分享 — 基于 FileProvider 的安全文件共享,支持微信、QQ、Telegram 等主流应用。
-
极致包体 — R8 压缩混淆 + 资源压缩 + ABI 过滤,确保安装包体积最小化。
本项目遵循 Google 推荐的现代化架构实践,完全使用原生方案构建:
| 模块 | 技术选型 |
|---|---|
| 开发语言 | 100% Kotlin |
| UI 框架 | Jetpack Compose + Material Design 3 + Edge-to-Edge |
| 多媒体处理 | FFmpegKit (com.mrljdx:ffmpeg-kit-full) |
| 音频引擎 | AndroidX Media3 ExoPlayer |
| 媒体探测 | Android 原生 MediaExtractor + MediaMetadataRetriever |
| 架构模式 | MVVM + StateFlow 单向数据流 |
| 文件存储 | Scoped Storage + MediaStore API(兼容 Android 10+) |
| 包体优化 | R8 压缩 + 资源压缩 + ABI 过滤(arm64-v8a, x86_64) |
- Android Studio(推荐版本 Iguana | 2023.2.1 或更新)
- Java 11+(注:编译需兼容 Gradle 版本)
- Android SDK Level 36+(建议 Target SDK API 36)
兼容性: 最低支持 Android 7.0(API 24),目标 SDK API 36。
- 克隆本项目:
git clone https://github.com/tianxing-ovo/AudioPeel.git
- 使用 Android Studio 打开项目根目录。
- 等待 Gradle 同步拉取依赖。
- 连接实体手机或配置好的 Android 模拟器。
- 点击
Run 'app'或在 Terminal 执行./gradlew assembleDebug。
在工程演进过程中,我们解决了多个 Android 碎片化开发中的典型难题,希望能为遇到同类问题的开发者提供思路:
-
SAF 直读优化 — 使用
FFmpegKitConfig.getSafParameterForRead()直接从content://URI 读取视频,彻底消除文件复制到缓存目录的耗时步骤。同时为 FFprobe 和 FFmpeg 分配独立的 SAF 文件描述符,解决了SAF id not found问题。 -
智能流复制加速 — 通过原生
MediaExtractor检测源音频编码,当编码与目标格式兼容时自动使用-c:a copy直接复制音频流,避免不必要的转码,实现秒级提取。 -
全版本媒体存储兼容 — 梳理了多代 Android 的路径保存机制:Android 10+ 采用
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI安全写入;过渡版本通过Documents Provider锚定 Music 文件夹;老版本执行传统物理创建。 -
MD3 交互精调 — 重新设计了 Slider 和 ExoPlayer 控制器,攻克了 Jetpack Compose 中后台进度更新与用户拖拽冲突导致的弹回抖动问题,实现细腻的阻尼级交互体验。
-
包体瘦身 — R8 压缩混淆 + 资源压缩 + ABI 架构过滤,私有目录在每次提取前自动清理历史文件,防止应用数据无限膨胀。
本应用遵循最小权限原则,无需任何敏感权限:
| 权限 | 说明 |
|---|---|
| 无存储权限 | 使用 Android Photo Picker 选取视频,无需 READ_EXTERNAL_STORAGE |
| 无网络权限 | 所有处理均在本地完成,不上传任何数据 |
| 无后台权限 | 不申请后台运行或通知权限 |
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/your-feature - 提交更改:
git commit -m "feat: add your feature" - 推送分支:
git push origin feature/your-feature - 发起 Pull Request
本项目基于 MIT License 协议开源。欢迎任何出于学习、分享和二次创作的使用。
