macOS 如何快速完成 QMC 格式转换?QMCDecode 终极解码实战指南
【免费下载链接】QMCDecodeQQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存储到~/Music/QMCConvertOutput,可自定义需要转换的文件和输出路径项目地址: https://gitcode.com/gh_mirrors/qm/QMCDecode
从 QQ 音乐下载的歌突然变成.qmcflac、.qmc0这样的加密后缀,播放器全部打不开——这是很多 macOS 用户都撞过的墙。QMCDecode 正是为这个痛点而生:一款专为 macOS 设计的 QMC 格式转换工具,能一键把qmcflac转flac、qmc0/qmc3转mp3、mflac/mflac0转flac,把加密缓存还原成能随意播放的标准音频。
一句话看懂它
如果把 QQ 音乐下载的加密文件比作"上了锁的音乐保险箱",那么:
- QMCDecode 就是那把万能钥匙——它既负责从文件尾部找回钥匙(密钥),又负责用正确的方法开锁(解密),最终把里面的音乐原样搬出来。
- 它比同类方案强在哪?打开 App 就自动识别 QQ 音乐缓存目录,列表里勾选、点一下"Start"就批量完成,全程不需要命令行、不需要手动找密钥。
本节小结:30 秒建立心智模型——QMC 格式转换 = 找钥匙 + 开锁 + 搬出音乐,QMCDecode 把这套流程做成了傻瓜式 GUI。
三步快速跑通第一个转换
QMCDecode 的最小可用路径非常简单,全程鼠标即可完成:
- 克隆并编译项目(仅需一次环境准备)
git clone https://gitcode.com/gh_mirrors/qm/QMCDecode cd QMCDecode open QMCDecode.xcodeproj在 Xcode 中选好你的开发者签名,按Cmd + B编译,Cmd + R运行。
选择文件:App 启动后会自动扫描 QQ 音乐 macOS 版的缓存目录,把识别到的加密文件列进表格;如果你手动下载过文件,也可以点左上角按钮自己选目录或文件。
点击 Start 开始转换:默认输出到
~/Music/QMCConvertOutput/,你也可以在右侧自定义输出路径。转换完成后会有成功/失败数量提示。
整个过程不碰任何命令行,唯一注意点是 macOS 系统可能要求你在"系统设置 → 隐私与安全性"里放行这个应用。
本节小结:三条命令 + 两次点击即可完成首次 QMC 格式转换,核心门槛只在 Xcode 编译这一步。
核心原理拆解:一把钥匙配三把锁
要理解 QMCDecode 为什么能通吃十几种加密后缀,关键在于它把流程拆成了两件事:先找钥匙,再选锁。
第一步:从文件尾部找回钥匙
所有 QMC 加密文件都把"钥匙"藏在文件末尾。QMDecoder打开文件后先读最后 4 个字节,判断来源:
- 移动端下载的文件以
QTag结尾,后面跟着 key 长度和 Base64 编码的原始 key; - PC/macOS 端下载的文件末尾 4 字节直接是小端序的 key 长度;
- 特殊情况下 key 长度异常(≥0x300),就退回到内置固定密钥
privateKey256兜底。
// QMDecoder.searchKey() 中的关键分支 if String(bytes: lastFourBytes, encoding: .utf8) == "QTag" { // 移动端:读 keySize,再按偏移读出 rawKey,用逗号定位 key 结束位置 } else { let keySize = lastFourBytes.withUnsafeBytes { $0.load(as: UInt32.self).littleEndian } if keySize < 0x300 { // PC 端:key 在文件尾,直接截取 } else { self.cipher = try QMStaticCipher(originKey: privateKey256) // 固定密钥兜底 } }找到的原始 key 是 Base64 编码的,接下来QMCKeyDecoder会用 TEA 算法把它解密成真正的音频密钥——这里的simpleMakeKey用tan()函数生成"盐",配合 16 字节的 TEA key 做 CBC 模式解密,最后校验尾部 7 个字节必须为 0 才算解密成功。
// QMCKeyDecoder 中 TEA key 的组装(节选) let simpleKey = simpleMakeKey(seed: 106, length: 8) var teaKey = UInt8 for index in 0..<8 { teaKey[index << 1] = simpleKey[index] // 奇数位:tan() 生成的盐 teaKey[(index << 1) + 1] = base64DecodedKey[index] // 偶数位:原始 key 前 8 字节 }第二步:密钥长短决定用哪把锁
拿到真正的密钥后,根据密钥长度选择对应的解密器(都在QMCipher.swift里,通过统一的QMCipher协议对外提供服务):
| 解密器 | 密钥长度 | 对应格式 | 通俗比喻 |
|---|---|---|---|
QMMapCipher | ≤300 | qmcflac、qmflac、bkcflac | 错位映射:按偏移查表再循环移位 |
QMRC4Cipher | >300 | mflac、mflac0、mgg、mgg1 | 流式滚轮:像转轮一样滚动打乱字节 |
QMStaticCipher | 固定内置 | 兜底场景 | 固定表:查固定 256 字节表做异或 |
比如QMMapCipher的核心就是一个"位置查表 + 循环移位"的异或运算:
func getMask(offset: Int) -> UInt8 { let temp = offset > 0x7FFF ? (offset % 0x7FFF) : offset let index = (temp * temp + 71_214) & 0xFF // 用偏移量算出一个表下标 return rotate(value: key[index], bits: index & 0x7) // 查表后再按位旋转 }而QMDecoder.setCipher的选型逻辑只有一句话:decodedKey.count > 300就用 RC4,否则用 Map。这就是"一把钥匙配三把锁"的全部秘密。
本节小结:解密不是魔法,而是"尾部找 key → TEA 解出真密钥 → 按长度选解密器 → 逐字节异或还原"四步流水线。
三个典型场景:把工具用出最大价值
场景一:一键批量转换整个音乐库
QMCDecode 的批量能力是默认自带的:自动识别缓存目录后,App 会按 CPU 物理核心数创建同等数量的并行队列,同时开转多个文件,进度条实时更新,完成后弹出成功/失败统计。
// ViewController 中按 CPU 核心数并发处理 let coreCount = ProcessInfo().processorCount for index in 0..<dataSource.count { queueArray[index % coreCount].async { let decoder = try QMDecoder(originFilePath: file.path, outputDirectory: outDir) try decoder.decryptAndWriteToFile() } }如果你只想转换其中几首,手动选择单个文件或目录即可,不用全量处理。
场景二:把解码能力集成进自己的 App
解码核心与界面完全解耦,QMDecoder可以直接拿来二次开发。初始化时传入源文件路径和输出目录,构造过程就会自动完成找 key、派生密钥、选定解密器,之后只需调用一个方法:
let decoder = try QMDecoder(originFilePath: qmcFilePath, outputDirectory: outputDir) try decoder.decryptAndWriteToFile()注意输出格式由Constants.swift里的encryptExtDictionary决定,例如"qmcflac" → "flac"、"qmc0" → "mp3",改这一张映射表就能扩展新格式。
场景三:转换后修正音乐标签(tag)
转换出的文件偶尔会有标签错乱,README 推荐用 kid3 修复:打开 kid3 选择输出目录,即可批量修改标题、艺术家、专辑等字段,然后再整理进自己的曲库。
本节小结:批量转换、核心复用、标签修复三个场景覆盖了从"自用"到"二开"的完整需求链。
高频问题速查
Q1:打开 App 后列表是空的,识别不到任何文件?原因:缓存目录里没有受支持的扩展名,或 QQ 音乐版本改动了缓存位置。 解决:确认文件后缀在支持列表内(qmcflac、qmc0、qmc3、mflac、mgg 等),或直接用"选择文件"按钮手动添加。
Q2:转换报unsupportFileExtension?原因:文件扩展名不在encryptExtDictionary的映射表里。 解决:检查后缀大小写,必要时手动重命名为受支持的扩展名再试。
Q3:转换完成的文件播放器打不开?原因:原始文件不完整,或密钥派生失败(移动端文件缺QTag尾部标记)。 解决:重新从 QQ 音乐下载完整文件;确认磁盘空间充足;用 kid3 修复标签后再试。
Q4:转换大文件时界面有点卡?原因:按 CPU 核心数全速并行,极端情况下资源吃满。 解决:分批转换、少开其他重负载应用;文件很多时把列表拆成几批处理。
Q5:Windows 上能用吗?原因:项目依赖 macOS 的 Cocoa 框架和FileHandle等系统 API。 解决:QMCDecode 仅支持 macOS,Windows 用户需要寻找其他平台的同类方案。
本节小结:绝大多数"转不了"都源于扩展名不支持或文件不完整,先自查这两点能省一半排查时间。
避坑与最佳实践清单
动手前对照这份清单,能少走很多弯路:
- 只转换自己合法获得的文件,遵守版权法规,工具仅供个人学习研究使用
- 转换不会改动源文件,输出全部写入新目录,可放心保留原始缓存
- 确认输出目录所在磁盘有足够剩余空间(FLAC 通常 20–50MB/首)
- 首次运行若被 Gatekeeper 拦截,去"系统设置 → 隐私与安全性"放行
- 转换后标签错乱时用 kid3 批量修复,而非手动逐个改
- 想扩展新格式时,只需在
Constants.swift注册扩展名映射即可 - 二次开发时复用
QMDecoder,不要重复实现找 key 逻辑
本节小结:记住"源文件不动、输出新目录、扩展名必须受支持"三条底线,基本不会出问题。
总结与延伸
QMCDecode 用极简的 GUI 和"找钥匙 + 选锁"的清晰架构,把 macOS 上 QMC 格式转换从"到处找命令行工具"变成了"打开即用"。无论你是想把自己 QQ 音乐缓存一键转成 flac/mp3 的普通用户,还是想在自有项目里复用解码能力的开发者,它都是一份值得收藏的参考实现。
想深入了解,可以从这几个源码文件继续读起:
- 解码器核心:QMDecoder.swift——找 key 与整体流程编排
- 三种解密算法:QMCipher.swift——静态、映射、RC4 的实现细节
- TEA 密钥派生:QMCKeyDecoder.swift 与 TeaCipher.swift
- 格式映射表:Constants.swift——全部支持格式一览
上手它,你的音乐库从此不再被 QMC 格式困住。
【免费下载链接】QMCDecodeQQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存储到~/Music/QMCConvertOutput,可自定义需要转换的文件和输出路径项目地址: https://gitcode.com/gh_mirrors/qm/QMCDecode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考