# NCM2FLAC
**Repository Path**: pth2000/NCM2FLAC
## Basic Information
- **Project Name**: NCM2FLAC
- **Description**: .ncm to .flac/.mp3
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 4
- **Created**: 2022-03-27
- **Last Updated**: 2025-04-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Python, ncm
## README
# NCM2FLAC
主要以研究加密解密原理为主,每一步的操作有较详细的注释。
源码基于ncmdump项目进行改写,更新为pycryptodome库。
------
## 音频基础
这部分内容部分参考于 [chuyaoxin](https://www.cnblogs.com/cyx-b/p/13443003.html) 和 [欧祎](https://www.jianshu.com/p/ec5977ef383a) 。
涉及一些数电领域知识。
### 音频采样原理
何为无损音乐?我们可以根据采样原理来一探究竟。
模数转换一般分三步走:采样=>量化=>编码,下面是一些通俗解释:
- 采样
> 声音是连续的模拟信号,通过采样,将之转变为离散的数字信号,其中要遵循的是**奈奎斯特定理**:只要采样频率不低于声音信号最高频率的两倍,采样得到的数字信号就能保真地记录、还原声音。
>
> 人耳能够听到的范围是20Hz到20kHz,所以采样频率一般为44.1kHz,这样就可以保证采样声音达到20kHz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。而所谓的44.1kHz就是代表1秒会采样44100次。
- 量化
> 量化是指在幅度轴上对信号进行数字化,就是用多少位的数据来记录一个采样。比如用16比特的二进制信号来表示声音的一个采样,而16比特(一个short)所表示的范围是[-32768,32767],共有65536个可能取值,因此最终模拟的音频信号在幅度上也分为了65536层。
- 编码
> 编码是指用二进制数来表示每个采样的量化值。如果量化是均匀的, 又采用自然二进制数表示,这种编码方法就是脉冲编码调制(PCM)。
所以,只要采样率足够,从音源角度讲,就可以称之为无损音乐(HI-FI,高保真音乐)。
### 有损音频格式/无损音频格式
常见的有损音频格式:
- MP3
> MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III)。MP3是利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率,对高频加大压缩比(甚至忽略信号)对低频信号使用小压缩比,保证信号不失真。这样一来就相当于抛弃人耳基本听不到的高频声音,只保留能听到的低频部分,从而将声音用1∶10甚至1∶12的压缩率压缩。由于这种压缩方式的全称叫MPEG Audio Player3,所以人们把它简称为MP3。
- AAC
> AAC,全称Advanced Audio Coding,是一种专为声音数据设计的文件压缩格式。出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
- Ogg
> Ogg全称是OGG Vorbis, 是一种音频压缩格式,类似于MP3等的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vorbis有一个特点是支持多声道。
- Opus
> Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用于网络上低延迟的即时声音传输,标准格式定义于RFC 6716文件。Opus格式是一个开放格式,使用上没有任何专利或限制。
常见的无损音频格式:
- WAV
> WAV是最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。Wave格式支持MSADPCM、CCITT A律、CCITT μ律和其他压缩算法,支持多种音频位数、采样频率和声道,是PC机上最为流行的声音文件格式;但其文件尺寸较大,多用于存储简短的声音片段。
- AIFF
> AIFF是音频交换文件格式(Audio Interchange File Format)的英文缩写,是一种文件格式存储的数字音频(波形)的数据,AIFF应用于个人电脑及其它电子音响设备以存储音乐数据。
>
> 本质上和WAV是一个东西,两者只是封装工艺不同,WAV是微软的,AIFF是苹果的。
- FLAC
> FLAC中文可解释为无损音频压缩编码。FLAC是一套著名的自由音频压缩编码,其特点是无损压缩。不同于其他有损压缩编码如MP3及AAC,它不会破坏任何原有的音频信息,所以可以还原音乐光盘音质。2012年以来它已被很多软件及硬件音频产品(如CD等)所支持。
- APE
> APE是流行的数字音乐无损压缩格式之一,因出现较早,在全世界特别是中国大陆有着广泛的用户群。与MP3这类有损压缩格式不可逆转地删除(人耳听力不敏感的)数据以缩减源文件体积不同,APE这类无损压缩格式,是以更精炼的记录方式来缩减体积,还原后数据与源文件一样,从而保证了文件的完整性。APE由软件Monkey's audio压制得到,开发者为Matthew T. Ashland,源代码开放,因其界面上有只“猴子”标志而出名。相较同类文件格式FLAC,ape有查错能力但不提供纠错功能,以保证文件的无损和纯正;其另一个特色是压缩率约为55%,比FLAC高,体积大概为原CD的一半,便于存储。
- ALAC
> ALAC 即Apple lossless audio codec的缩写,是苹果公司开发的一种无损音频格式,苹果在Apache v2.0许可证下开源了“苹果无损音频编解码器(Apple Lossless Audio Codec,缩写ALAC)”。是对AIFF的压缩,类似于FLAC是对WAV的压缩一样,自然文件小。ALAC同AAC一样是MPEG-4封装,扩展名是m4a。
- DSD(dsf/dff)
> DSD是Direct Stream Digital的缩写,表示直接比特流数字编码,是SACD(Super Audio CD)的编码模式。它是Sony与Philips在1996年宣布共同发展的高解析数字音响规格。
根据前人的研究,NCM格式并非是一种全新的音频格式,而是一种加密格式,下面将分析NCM的文件结构。
------
## 文件结构
下图来源于 [yoki123](https://github.com/yoki123/ncmdump) 的项目。

上图可以与下表结合来看,更容易理解NCM文件的整体结构。
下面的表格同样展示了NCM的结构,并给出了对应的处理策略,来源于 [charlotte-xiao](https://github.com/charlotte-xiao/NCM2MP3) 的项目。
| 信息 | 大小 | 备注 |
|:----------------------:|:--------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------|
| Magic Header | 10 bytes | 跳过 |
| KEY Length | 4 bytes | 用AES128加密RC4密钥后的长度(小端字节排序,无符号整型) |
| KEY From AES128 Decode | KEY Length
(128 bytes) | 用AES128加密的RC4密钥
注意:
1.按字节对0x64异或
2.AES解密(其中PKCS5Padding填充模式会去除末尾填充部分;)
3.去除前面`neteasecloudmusic`17个字节; |
| Mata Length | 4 bytes | Mata的信息的长度(小端字节排序,无符号整型) |
| Mata Data(JSON) | Mata Length | JSON的格式的Mata的信息
注意:
1.按字节对0x63异或;
2.去除前面`163 key(Don't modify):`22个字节;
3.Base64进行decode;
4.AES解密;
5.去除前面`music:`6个字节后获得JSON |
| CRC校验码 | 4 bytes | 跳过 |
| Gap | 5 bytes | 跳过 |
| Image Size | 4 bytes | 图片大小 |
| Image | Image Size | 图片数据 |
| Music Data | - | RC4-KSA生成s盒,RC4-PRGA解密 |
## 详细步骤
建议看 [这一篇文章](https://www.cnblogs.com/cyx-b/p/13443003.html) ,讲的非常详细。
简单一点,可以直接看main.py文件,我已添加注释。
### 关于如何查看文件的16进制代码:
如果你使用notepad++,你可以在插件中安装Hex-Editor,开启此插件即可。
## 使用
执行main.py,在选择框中选择文件所在目录即可。