# 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) 的项目。 ![结构图](./img/结构图.png) 上图可以与下表结合来看,更容易理解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,在选择框中选择文件所在目录即可。