把音乐从电脑复制到车载 U 盘、独立播放器或剪辑软件时,有时会遇到一个看起来很奇怪的问题:文件明明已经下载到本地,却不是常见的 MP3 或 FLAC,而是 NCM、MFLAC、KGM、KWM 等格式。其他播放器无法识别,单纯修改扩展名也没有作用。

GitHub 项目 music-geshizhuanhuan 针对的就是这类本地文件兼容问题。根据项目当前说明,它可以处理网易云音乐、QQ音乐、酷狗音乐和酷我音乐的多种加密音乐格式,将能够解析的文件还原为原始音频容器,或者进一步统一转码为 MP3、FLAC、M4A、WAV、OGG 等常见格式。

需要注意的是,它所说的“网页版”并不是把音乐上传到某个在线网站转换,而是在用户自己的电脑上启动一个本地 Web 服务,再通过浏览器操作。这一点也决定了它和普通在线音频转换网站有明显区别。

music-geshizhuanhuan:音乐音频格式转换工具

这个项目主要解决什么问题

音乐平台为了自己的客户端播放、缓存和内容管理,会使用特定的文件封装或加密方式。于是用户即使在本地找到了音乐文件,也可能不能直接交给 VLC、车机、MP3 播放器、剪辑软件或其他音频工具使用。

music-geshizhuanhuan 的处理流程并不是简单地把文件后缀从 .ncm 改成 .mp3。项目会先根据文件特征和扩展名判断具体格式,再调用相应的解析模块还原内部音频数据,之后识别实际的 MP3、FLAC、OGG、M4A 或 WAV 容器。

如果原文件中的音频已经是 FLAC,那么在不主动转码的情况下,可以直接输出还原后的原始容器;如果用户希望所有文件最后都变成统一格式,则可以再调用 ffmpeg 完成转码。

这种设计比较适合整理已有音乐库。例如一个目录里同时存在 NCM、MFLAC 和 KGM 文件,可以批量处理,而不必针对每个平台分别寻找不同工具。

目前支持哪些音乐格式

项目并不是笼统地宣称支持几个音乐平台,而是在 README 中列出了具体格式及版本差异。不同平台的新旧加密方式存在区别,因此“支持某个平台”并不代表该平台历史上和当前的所有文件都一定能够直接处理。

平台主要支持格式当前情况
网易云音乐NCM支持,并可提取歌名、歌手、专辑和封面等元数据
QQ音乐MFLAC、MGG、QMCFLAC、QMCOGG、QMC0~8 等支持多种 QMC v1、v2 格式,部分新版文件存在额外密钥要求
QQ音乐TKM、BKCMP3、BKCM4A、BKCFLAC 等支持使用静态密钥方式处理的旧格式
酷狗音乐KGM、KGMA、VPR 等支持 v1 至 v4 类型
酷狗音乐KGG当前暂未支持
酷我音乐KWM主要覆盖老版格式

其中 QQ 音乐需要特别注意版本差异。项目说明中提到,部分新版 MFLAC、MGG 文件已经不再把所需密钥直接放在文件内部,因此不能像旧文件一样直接拖进去完成转换。这类文件需要额外的 EKey 或相应密钥数据库才能处理。

酷狗的 KGG v5 当前也被项目明确列为未实现格式;酷我方面则主要覆盖老版 KWM。因此,如果手上的文件来自较新的客户端版本,最好先核对具体扩展名和 README 中的支持矩阵,而不是只看平台名称。

网页操作其实运行在本机

对于不习惯命令行的用户,项目提供了一个 Flask Web 界面。运行项目后,浏览器访问本机的 127.0.0.1:8686,就可以通过拖拽方式添加音乐文件或文件夹。

网页界面支持自动识别格式、排队处理、进度显示,以及歌名、歌手、专辑和封面等信息预览。处理完成后可以单独下载,也可以将多个结果统一打包为 ZIP。

输出格式可以选择保持原样,也可以转换为 MP3、FLAC、M4A、WAV 或 OGG。对只是偶尔整理一批音乐文件的人来说,这种方式比记忆命令行参数直观得多。

这里的“网页”更准确地说是“浏览器操作界面”。服务只监听本机回环地址,项目官方说明文件处理过程在本地完成,不需要把音乐上传到远程转换服务器,同时项目没有加入遥测功能。

不过它并不是打开一个公共网址就能直接使用的在线工具。用户仍然需要先下载项目代码、准备 Python 环境并安装项目依赖,然后启动本地服务。因此,它在操作界面上比较接近普通网页工具,在部署方式上仍属于本地运行的软件项目。

命令行更适合批量音乐库

如果只是转换几首音乐,拖拽网页已经足够;当文件数量增加,或者需要长期整理音乐目录时,命令行模式更容易形成固定工作流。

项目的命令行入口支持单文件、多文件和目录输入,目录默认可以递归处理。用户还能够指定输出目录、决定是否覆盖已有文件、关闭封面写入,或者在真正开始处理之前使用 dry-run 查看执行计划。

例如最基本的单文件处理方式是:

./run.sh 歌曲.ncm

批量处理目录时可以指定新的输出位置:

./run.sh 音乐目录/ -o out

如果希望不同来源的音乐最后全部统一成 FLAC,也可以指定输出格式:

./run.sh 音乐目录/ -o out --format flac

Windows 用户同样可以运行核心程序,只是项目说明建议将 Shell 启动脚本换成直接执行 python unlocker.py

从实际使用方式来看,网页模式更偏向人工选择和少量操作,命令行模式则适合批量目录、脚本调用以及重复执行。两套界面背后使用的是同一套格式解析引擎。

解密和转码

理解这个项目时,一个比较重要的区别是“还原文件”和“重新编码音频”并不是同一件事。

项目首先完成的是加密格式解析。例如一个 NCM 文件内部原本保存的是 FLAC 音频,解析后的结果仍然可以保持为 FLAC。这一步主要是恢复原来的标准音频容器,并不要求重新压缩音频。

而用户主动指定 --format mp3--format flac 等参数后,才会进入转码阶段。项目通过 ffmpeg 将已经恢复的音频转换成目标格式。

因此,只想恢复原始音频时并不需要安装 ffmpeg;只有需要统一格式时才依赖 ffmpeg。

这一点对无损音乐尤其重要。原始 FLAC 文件还原后可以继续保持 FLAC,而如果主动转换成 MP3,则会进入有损编码过程。项目当前说明中,MP3 转码使用 320 kbps CBR,所以对无损音乐库来说,没有必要为了“格式统一”而把所有文件都转成 MP3。

歌曲信息和封面也能保留

音乐转换并不只有音频本身。一个整理完整的音乐库通常还需要歌曲名称、艺术家、专辑信息以及封面,否则转换之后虽然能播放,播放器中的歌曲列表却可能变得很混乱。

music-geshizhuanhuan 使用 mutagen 处理音频标签和封面。对于能够获得元数据的文件,项目会在输出阶段写回这些信息,其中 NCM 可以直接提取相应的歌曲元数据。

如果用户不需要这些内容,也可以关闭标签或封面的嵌入。对于准备导入音乐管理软件、家庭媒体服务器或车载播放器的人来说,保留元数据通常比单纯得到一个可以播放的文件更有价值。

项目运行环境

这个项目主要使用 Python 实现。目前仓库的 requirements.txt 只列出了三个第三方 Python 依赖:

  • pycryptodome:用于相关密码算法处理。

  • mutagen:负责音频标签和封面操作。

  • flask:提供本地网页界面的 Web 服务。

基础安装方式是克隆 GitHub 仓库,创建 Python 虚拟环境,然后根据 requirements.txt 安装依赖。需要执行音频转码时,再另外准备 ffmpeg。

仓库同时包含格式解析模块、批处理模块、转码模块、标签处理模块、Flask 服务和原生 JavaScript 前端,并提供测试目录。项目 README 说明目前包含针对四类格式、边界情况、大文件和 Web API 的自动测试,同时使用合成音频样本进行交叉验证。

当前 GitHub 仓库页面没有显示正式 Release 下载包,因此它更接近一个需要从源代码运行的开源工具,而不是下载 EXE 或安装包后直接使用的桌面软件。这也意味着完全没有 Python 使用经验的用户,第一次部署仍然存在一定门槛。

本地处理

音频转换工具经常需要处理体积较大的文件。如果使用在线网站,不仅要等待上传和下载,还需要考虑文件会被发送到什么服务器以及是否会被临时保存。

music-geshizhuanhuan 的 Web 服务默认绑定 127.0.0.1,浏览器虽然显示的是一个网页界面,但浏览器和处理程序都运行在自己的电脑上。

对于拥有较大音乐库、单个 FLAC 文件体积较大,或者不希望把个人音乐文件提交给第三方在线转换站点的用户,本地方式会更加合适。同时,处理速度主要取决于本机磁盘、CPU 和具体文件,而不是网络上传速度。

不过“本地运行”也意味着计算环境需要由用户自己维护,例如安装 Python、处理依赖问题以及在需要转码时配置 ffmpeg。这是它和真正在线工具之间的取舍。

并不一定都能直接转换

这类工具最大的使用边界来自音乐平台格式本身会变化。项目已经明确列出了几个当前限制。

  • 酷狗 KGG v5 当前尚未实现。

  • 酷我主要覆盖老版 KWM。

  • 部分新版 QQ 音乐 MFLAC、MGG 文件不再内嵌 EKey,无法直接按照旧格式处理。

  • 指定 MP3 输出时属于有损转码,不等于保留原始无损质量。

尤其是 QQ 音乐的新格式,README 提供了额外密钥和数据库参数,但这类操作明显比普通拖拽转换复杂,需要用户理解文件版本及自身设备环境。对于只想找一个“任何文件拖进去都能转换”的工具来说,这种版本限制需要提前考虑。

另一方面,如果手里的文件本身已经能够被普通播放器识别,就没有必要为了转换而再次编码。额外转码不仅增加时间,还可能改变原始音频质量。

参考资料

  1. music-geshizhuanhuan GitHub 项目仓库

  2. 项目 README 使用与格式说明

  3. 项目 Python 依赖说明

  4. 项目 MIT 开源许可证