網(wǎng)易云音樂ncm編解碼原理
背景
辦了個網(wǎng)易黑膠會員波岛,想著整個無損音樂庫放walkman里聽主巍,不再受流量和音質(zhì)的苦。萬萬沒想到網(wǎng)易自己搞了個ncm的格式觉痛,見都沒見過,walkman上沒法識別茵休,據(jù)說會員過期了還不給播了薪棒。
我知道了,這是租賃不是購買榕莺,看了下網(wǎng)友們對網(wǎng)易云的口誅筆伐俐芯,我倒沒啥感覺,黑膠會員這個價格钉鸯,你說買站內(nèi)所有音樂版權(quán)肯定是不夠的吧史,租賃也沒啥問題。就是音樂搞租賃這個做法以前沒見過不太習(xí)慣,我就想在我的隨身聽上播放ncm僅此而已唠雕。
網(wǎng)上有挺多奇技淫巧比如從mv轉(zhuǎn)贸营,從h5元素里抓url等等吨述,感覺都差點意思,想著能不能寫個ncm轉(zhuǎn)常見無損格式的軟件钞脂。為此還去學(xué)習(xí)了一下音頻格式以及編解碼的一些基礎(chǔ)知識揣云。
研究了大半天,遇到了很多無法逾越的問題冰啃,后來在github上發(fā)現(xiàn)了有人用c++基于openssl庫編寫了ncm轉(zhuǎn)碼 https://github.com/anonymous5l/ncmdump 灵再。之后陸續(xù)出現(xiàn)了用python,golang亿笤,android翎迁,.NET等平臺移植的轉(zhuǎn)換庫。才疏學(xué)淺净薛,那不重復(fù)造輪子了汪榔,就對著源碼做個逆向分析。
思考
有幾個問題
- 何為無損肃拜?無損就是HiFi的意思嗎痴腌?
- ncm是怎樣的格式?是網(wǎng)易自研的編碼還是在無損格式上套一層殼燃领?(且先不質(zhì)疑網(wǎng)易的技術(shù)實力士聪,目前音頻編碼格式已經(jīng)很成熟了,自研已無必要猛蔽,我傾向猜它是為了商業(yè)目的在套殼)
- 如果不是套殼剥悟,那如何知道一首歌原來的格式,是轉(zhuǎn)成flac,wav還是ape?
- mp3,flac,wav,wmv,ape等等這些格式有啥區(qū)別曼库?
嗯 我研究了一下 答案在后面
音頻的基礎(chǔ)概念
這里有幾個音頻的基礎(chǔ)概念
- 聲音: 20Hz~20kHz 可以被人耳識別到的聲波
- 采樣率:指計算機(jī)每秒鐘采集多少個聲音樣本区岗,自然界的聲音是模擬信號,這種模擬信號被相關(guān)設(shè)備通過“采樣”毁枯、“量化”后慈缔,以數(shù)字的方式存放在計算機(jī)中。根據(jù)奈奎斯特采樣理論:只要采樣頻率不低于聲音信號最高頻率的兩倍种玛,采樣得到的數(shù)字信號就能保真地記錄藐鹤、還原聲音。既然人耳能聽到音頻信號頻率大約在20Hz-20KHz之間赂韵,根據(jù)奈奎斯特采樣理論娱节,如果采樣頻率大于40KHz,那么得到的數(shù)字信號就可以高保真的記錄模擬信號右锨,就能“HiFi”了括堤。
- 量化精度:樣本大小是用每個聲音樣本的位數(shù)bit/s表示,反映度量聲波幅度的精度绍移。樣本位數(shù)的大小影響到聲音的質(zhì)量悄窃,位數(shù)越多,則精度越高蹂窖,聲音的質(zhì)量越高轧抗,而需要的存儲空間也越多。
- 編碼:編碼是指用二進(jìn)制數(shù)來表示每個采樣的量化值瞬测。如果量化是均勻的横媚, 又采用自然二進(jìn)制數(shù)表示,這種編碼方法就是脈沖編碼調(diào)制(PCM)月趟, 這是一種最簡單粗暴卻效率最高的編碼方法灯蝴。
所以上面說的奈奎斯特采樣理論得出的HiFi,這是“音源”HiFi,這東西是玄學(xué)孝宗,如果音源HiFi,但是你的設(shè)備解碼能力不行穷躁,或者是耳機(jī)表現(xiàn)力度不行,那最終的結(jié)果還是達(dá)不到HiFi水準(zhǔn)因妇,所以現(xiàn)在很多土豪在燒器材設(shè)備问潭,一分錢一分貨,一塊錢兩分貨婚被,追求的就是那種狡忙,與原來的聲音高度相似的重放聲音的,“高保真”聽感址芯。
目前能夠達(dá)到最高保真水平的就是PCM編碼灾茁,CD中采用的就是這種編碼格式,即無損編碼谷炸。
有損音樂格式主要有:MP3删顶、WMA、AAC等等淑廊,當(dāng)年周杰倫時代我們手里拿的紐曼mp3隨身聽逗余,見到最多的格式就是這三種,一首大概3M左右季惩。對文件進(jìn)行了不可逆向的壓縮录粱,從頻譜上看上半部分都被切掉了。 用比如spek這類專業(yè)的音頻分析軟件画拾,可以驗證出一首無損音樂是真無損還是敗絮其中的假無損啥繁。
無損音樂格式主要有WAV、AIFF青抛、FLAC旗闽、APE、ALAC等等,WAV适室、AIFF是CD的數(shù)字記錄嫡意,基本上是由CD轉(zhuǎn)成數(shù)字形式所得到的文件;而APE捣辆、FLAC等是對WAV文件進(jìn)行無損壓縮后得到的蔬螟,即再加工得到。所以汽畴,wav是無損音樂文件旧巾,而APE、FLAC等則是無損壓縮音樂文件忍些。AIFF是蘋果自研鲁猩,WAV是微軟自研。
這么一說,WAV可以直接播放罢坝,而常見的APE廓握、FIAC等其他壓縮格式則需要經(jīng)過解壓(解碼)還原成WAV才能播放。這需要一定的cpu計算成本炸客,會影響續(xù)航疾棵。walkman隨身聽官網(wǎng)上對設(shè)備的續(xù)航介紹,播放不同格式的音樂痹仙,續(xù)航持久能力也是不一樣的是尔。
得出初步結(jié)論,如果不是套殼希望能把ncm直接轉(zhuǎn)成wav的格式开仰。如果是套殼拟枚,就把它轉(zhuǎn)成原本的格式。
所謂不可逾越的困難
- 拿不到ncm格式的協(xié)議众弓。無論是套殼還是自研格式恩溅,沒有格式的協(xié)議,就沒法準(zhǔn)確的分解二進(jìn)制文件谓娃。
- 拿不到密鑰脚乡。如果是套殼,肯定是會被加密的滨达,沒有密鑰就沒法decode奶稠。
編解碼原理
核心代碼已標(biāo)注,A B C D 四塊
其中的兩次AES加密的密鑰捡遍,是從哪里搞來的锌订,天上掉下來的,只能這么猜了画株,不能再往深的去猜了辆飘。啦辐。。
A 是AES對稱加密算法中蜈项,的基礎(chǔ)加密方式ECB(Electronic Codebook Book)的解碼芹关。這種方式會把密文分割成分組長度相等的塊(不足補(bǔ)齊),然后單獨一個個加密战得,一個個輸出組成密文充边。所以從web前端爬url的方案難度是比較大的庸推,得一個個解密再拼接常侦。
B 是標(biāo)準(zhǔn)RC4-KSA算法(Key-scheduling algorithm)。
C 是base64解碼+AES對稱加密的解碼贬媒,為什么套base64,base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息聋亡。
D 是RC4-PRGA算法(Pseudo-random generation algorithm)還原s-box。
所以通過逆向际乘,還原一下網(wǎng)易云音樂加殼的過程坡倔。
- 1.先對該無損音樂進(jìn)行RC4-KSA算法初始化。
- 2.然后把初始化的產(chǎn)物用AES算法做一層加密脖含。
- 3.再對AES加密后的產(chǎn)物套一層base64編碼罪塔。
- 4.再對base64編碼后的產(chǎn)物做RC4-PRGA加密算法,即偽隨機(jī)子密碼生成算法养葵。
- 5.最后再對這個產(chǎn)物做一層AES加密征堪。
這其中會在一些步驟中加入一些特有的標(biāo)識比如neteasecloudmusic,以及magic串关拒,這些細(xì)節(jié)就不寫了佃蚜。
END
這是我用python腳本轉(zhuǎn)的,效果還不錯着绊。
(python里的AES解碼谐算,mac上需要依賴pycrypto庫)