Android 多媒体工具箱 · NCM 解密 · 音频处理 · 哔哩哔哩解析
基于 ncmdump C++ 核心的 Android 图形化解密工具,附带哔哩哔哩视频解析与音频处理功能。 界面采用 Material 3 / Material You 设计,Android 12+ 可跟随系统动态取色。
- 粘贴分享链接自动识别平台
- 聚合解析接口获取无水印视频直链
- 内置播放、下载无水印视频、复制直链
- 支持图集:一键下载全部图片
- 选择单个或多个 .ncm 文件批量解密
- 自定义输出目录(自动记忆上次选择)
- 解密后自动写入专辑封面 + ID3 元数据(歌曲名/艺术家/专辑)
- 自动爬取网易云歌词,输出同名 .lrc 文件
- 批量解密进度显示
- 自动识别输出格式(mp3 / flac)
- 支持 armeabi-v7a / arm64-v8a / x86 / x86_64 全架构
- 输入 BV 号或视频链接,解析视频信息
- 显示封面、标题、UP主、时长、简介、分P列表
- 获取 DASH 播放地址(视频流 + 音频流),支持复制
- wbi 签名自动处理
- 在线搜索歌曲 / 歌手
- 点击结果直接试听,播放/暂停可在系统通知栏与锁屏控制(Media3 媒体会话)
- 一键下载歌词(.lrc,原文 + 翻译合并),可预览
- 长按结果复制音频直链 / 下载音频
- 下载音频时自动保存同名 .lrc 歌词
- Material 3 / Material You 界面,Android 12+ 动态取色
- 深色 / 浅色 / 跟随系统三种模式
- 自定义背景图片:叠加主题色半透明遮罩,卡片与悬浮栏透明化,任意明暗背景图都能保持可读
- 卡片不透明度可调
- 更新检测使用 Material 3 对话框,展示版本对比与更新说明
NcmDumpAndroid/
├── app/
│ ├── build.gradle
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/ncmdump/app/
│ │ ├── MainActivity.kt # 主界面:NCM解密
│ │ ├── BiliActivity.kt # B站视频解析界面
│ │ ├── NcmCrypt.kt # JNI 绑定类
│ │ ├── MetadataWriter.kt # ID3元数据/封面写入
│ │ ├── LyricFetcher.kt # 网易云歌词爬取
│ │ └── BiliParser.kt # B站API解析(含wbi签名)
│ ├── jni/
│ │ ├── CMakeLists.txt # NDK 构建配置
│ │ ├── ncm_jni.cpp # JNI 绑定层
│ │ ├── ncmcrypt.cpp # ncm 解密核心
│ │ ├── ncmcrypt.h
│ │ ├── aes.cpp / aes.h # AES-128-ECB
│ │ ├── cJSON.cpp / cJSON.h # JSON 解析
│ │ └── base64.h # Base64
│ └── res/
│ ├── layout/
│ │ ├── activity_main.xml
│ │ └── activity_bili.xml
│ └── values/
├── build.gradle
├── settings.gradle
└── gradle.properties
ncm 文件采用两层加密:
- 密钥层:文件头内置经异或混淆的核心密钥,用固定
sCoreKey经 AES-128-ECB 解密后构建 RC4 风格的 keybox - 音频层:原始音频流用 keybox 逐字节异或解密,输出标准 mp3 或 flac
- 元数据层:歌曲名/艺术家/专辑/封面经
sModifyKeyAES 解密 + Base64 解码后解析
- JDK 17
- Android SDK Platform 34
- Android NDK 25.2.9519653
- CMake 3.22.1
- Gradle 8.2
export JAVA_HOME=/path/to/jdk17
export ANDROID_HOME=/path/to/android-sdk
gradle assembleDebug # 调试包,无需签名
gradle assembleRelease # 发布包,需要仓库根目录的 release.jksAPK 输出路径:app/build/outputs/apk/debug/、app/build/outputs/apk/release/
- Android CI(
.github/workflows/build.yml):push 到master时构建 Debug APK 并上传 Artifact - Release(
.github/workflows/release.yml):推送v*标签时构建签名 Release 并发布 GitHub Release- 签名信息通过仓库 Secrets 注入:
SIGNING_KEYSTORE_BASE64/SIGNING_STORE_PASSWORD/SIGNING_KEY_ALIAS/SIGNING_KEY_PASSWORD
- 签名信息通过仓库 Secrets 注入:
- 安装 APK 后打开应用
- 首次使用需授予「所有文件访问权限」
- 点击「选择 ncm 文件」,选择 .ncm 文件(可多选)
- (可选)点击「选择输出目录」指定保存位置(自动记忆)
- 点击「开始解密」,等待进度完成
- 解密后的 mp3/flac + .lrc 歌词保存在输出目录
- 首页「更多工具」可进入 B站视频解析
Android 10+ 采用 Scoped Storage,通过 SAF 选择的文件只有 content:// Uri。解决方案:
- 先将 Uri 对应的文件流拷贝到应用私有缓存目录
- 获取缓存文件的绝对路径传给 native 层解密
- 解密完成后删除缓存文件
- 同时持久化 SAF Tree Uri 和解析后的真实路径
- 启动时恢复 Uri,路径失效时自动重新解析
- 支持内置存储(primary:)和 SD 卡(xxxx-xxxx:)路径映射
android:largeHeap="true"增加内存配额- 后处理流程全部使用
Throwable捕获,防止 OOM 导致闪退 - 封面超过 10MB 时自动跳过写入
- 使用
net.jthink:jaudiotagger:3.0.1纯 Java 库 - 支持 MP3 ID3v2 和 FLAC 格式
- 封面写入:
deleteArtworkField()+addField(artwork)避免冲突 - 每项操作独立 try-catch,单项失败不影响整体
每个版本的改动记录在 CHANGELOG.md,详见 Releases。
本工具仅供个人已购买/下载歌曲的本地备份使用。未经授权传播、商用解密后的音频文件,会侵犯音乐作品著作权。B站解析功能仅供学习研究使用。
by.muling