網(wǎng)易云音樂ncm編解碼探究記錄

網(wǎng)易云音樂ncm編解碼原理

背景

辦了個網(wǎng)易黑膠會員,想著整個無損音樂庫放walkman里聽,不再受流量和音質的苦。萬萬沒想到網(wǎng)易自己搞了個ncm的格式,見都沒見過,walkman上沒法識別,據(jù)說會員過期了還不給播了。

我知道了,這是租賃不是購買,看了下網(wǎng)友們對網(wǎng)易云的口誅筆伐,我倒沒啥感覺,黑膠會員這個價格,你說買站內所有音樂版權肯定是不夠的,租賃也沒啥問題。就是音樂搞租賃這個做法以前沒見過不太習慣,我就想在我的隨身聽上播放ncm僅此而已。

網(wǎng)上有挺多奇技淫巧比如從mv轉,從h5元素里抓url等等,感覺都差點意思,想著能不能寫個ncm轉常見無損格式的軟件。為此還去學習了一下音頻格式以及編解碼的一些基礎知識。

研究了大半天,遇到了很多無法逾越的問題,后來在github上發(fā)現(xiàn)了有人用c++基于openssl庫編寫了ncm轉碼 https://github.com/anonymous5l/ncmdump 。之后陸續(xù)出現(xiàn)了用python,golang,android,.NET等平臺移植的轉換庫。才疏學淺,那不重復造輪子了,就對著源碼做個逆向分析。

思考

有幾個問題

  • 何為無損?無損就是HiFi的意思嗎?
  • ncm是怎樣的格式?是網(wǎng)易自研的編碼還是在無損格式上套一層殼?(且先不質疑網(wǎng)易的技術實力,目前音頻編碼格式已經(jīng)很成熟了,自研已無必要,我傾向猜它是為了商業(yè)目的在套殼)
  • 如果不是套殼,那如何知道一首歌原來的格式,是轉成flac,wav還是ape?
  • mp3,flac,wav,wmv,ape等等這些格式有啥區(qū)別?

嗯 我研究了一下 答案在后面

音頻的基礎概念

這里有幾個音頻的基礎概念

  • 聲音: 20Hz~20kHz 可以被人耳識別到的聲波
  • 采樣率:指計算機每秒鐘采集多少個聲音樣本,自然界的聲音是模擬信號,這種模擬信號被相關設備通過“采樣”、“量化”后,以數(shù)字的方式存放在計算機中。根據(jù)奈奎斯特采樣理論:只要采樣頻率不低于聲音信號最高頻率的兩倍,采樣得到的數(shù)字信號就能保真地記錄、還原聲音。既然人耳能聽到音頻信號頻率大約在20Hz-20KHz之間,根據(jù)奈奎斯特采樣理論,如果采樣頻率大于40KHz,那么得到的數(shù)字信號就可以高保真的記錄模擬信號,就能“HiFi”了。
  • 量化精度:樣本大小是用每個聲音樣本的位數(shù)bit/s表示,反映度量聲波幅度的精度。樣本位數(shù)的大小影響到聲音的質量,位數(shù)越多,則精度越高,聲音的質量越高,而需要的存儲空間也越多。
  • 編碼:編碼是指用二進制數(shù)來表示每個采樣的量化值。如果量化是均勻的, 又采用自然二進制數(shù)表示,這種編碼方法就是脈沖編碼調制(PCM), 這是一種最簡單粗暴卻效率最高的編碼方法。

所以上面說的奈奎斯特采樣理論得出的HiFi,這是“音源”HiFi,這東西是玄學,如果音源HiFi,但是你的設備解碼能力不行,或者是耳機表現(xiàn)力度不行,那最終的結果還是達不到HiFi水準,所以現(xiàn)在很多土豪在燒器材設備,一分錢一分貨,一塊錢兩分貨,追求的就是那種,與原來的聲音高度相似的重放聲音的,“高保真”聽感。

目前能夠達到最高保真水平的就是PCM編碼,CD中采用的就是這種編碼格式,即無損編碼。

有損音樂格式主要有:MP3、WMA、AAC等等,當年周杰倫時代我們手里拿的紐曼mp3隨身聽,見到最多的格式就是這三種,一首大概3M左右。對文件進行了不可逆向的壓縮,從頻譜上看上半部分都被切掉了。 用比如spek這類專業(yè)的音頻分析軟件,可以驗證出一首無損音樂是真無損還是敗絮其中的假無損。

無損音樂格式主要有WAV、AIFF、FLAC、APE、ALAC等等,WAV、AIFF是CD的數(shù)字記錄,基本上是由CD轉成數(shù)字形式所得到的文件;而APE、FLAC等是對WAV文件進行無損壓縮后得到的,即再加工得到。所以,wav是無損音樂文件,而APE、FLAC等則是無損壓縮音樂文件。AIFF是蘋果自研,WAV是微軟自研。

這么一說,WAV可以直接播放,而常見的APE、FIAC等其他壓縮格式則需要經(jīng)過解壓(解碼)還原成WAV才能播放。這需要一定的cpu計算成本,會影響續(xù)航。walkman隨身聽官網(wǎng)上對設備的續(xù)航介紹,播放不同格式的音樂,續(xù)航持久能力也是不一樣的。

得出初步結論,如果不是套殼希望能把ncm直接轉成wav的格式。如果是套殼,就把它轉成原本的格式。

所謂不可逾越的困難

  • 拿不到ncm格式的協(xié)議。無論是套殼還是自研格式,沒有格式的協(xié)議,就沒法準確的分解二進制文件。
  • 拿不到密鑰。如果是套殼,肯定是會被加密的,沒有密鑰就沒法decode。

編解碼原理


核心代碼已標注,A B C D 四塊

其中的兩次AES加密的密鑰,是從哪里搞來的,天上掉下來的,只能這么猜了,不能再往深的去猜了。。。

A 是AES對稱加密算法中,的基礎加密方式ECB(Electronic Codebook Book)的解碼。這種方式會把密文分割成分組長度相等的塊(不足補齊),然后單獨一個個加密,一個個輸出組成密文。所以從web前端爬url的方案難度是比較大的,得一個個解密再拼接。

B 是標準RC4-KSA算法(Key-scheduling algorithm)。

C 是base64解碼+AES對稱加密的解碼,為什么套base64,base64編碼可用于在HTTP環(huán)境下傳遞較長的標識信息。

D 是RC4-PRGA算法(Pseudo-random generation algorithm)還原s-box。

所以通過逆向,還原一下網(wǎng)易云音樂加殼的過程。

  • 1.先對該無損音樂進行RC4-KSA算法初始化。
  • 2.然后把初始化的產(chǎn)物用AES算法做一層加密。
  • 3.再對AES加密后的產(chǎn)物套一層base64編碼。
  • 4.再對base64編碼后的產(chǎn)物做RC4-PRGA加密算法,即偽隨機子密碼生成算法。
  • 5.最后再對這個產(chǎn)物做一層AES加密。

這其中會在一些步驟中加入一些特有的標識比如neteasecloudmusic,以及magic串,這些細節(jié)就不寫了。

END

這是我用python腳本轉的,效果還不錯。
(python里的AES解碼,mac上需要依賴pycrypto庫)

在當前目錄下生成了flac產(chǎn)物
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。