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

網(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庫)

在當(dāng)前目錄下生成了flac產(chǎn)物
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市归露,隨后出現(xiàn)的幾起案子洲脂,更是在濱河造成了極大的恐慌,老刑警劉巖剧包,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恐锦,死亡現(xiàn)場離奇詭異,居然都是意外死亡玄捕,警方通過查閱死者的電腦和手機(jī)踩蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枚粘,“玉大人馅闽,你說我怎么就攤上這事。” “怎么了福也?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵局骤,是天一觀的道長。 經(jīng)常有香客問我暴凑,道長峦甩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任现喳,我火速辦了婚禮凯傲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗦篱。我一直安慰自己冰单,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布灸促。 她就那樣靜靜地躺著诫欠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浴栽。 梳的紋絲不亂的頭發(fā)上荒叼,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音典鸡,去河邊找鬼被廓。 笑死,一個胖子當(dāng)著我的面吹牛椿每,可吹牛的內(nèi)容都是我干的伊者。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼间护,長吁一口氣:“原來是場噩夢啊……” “哼亦渗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汁尺,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤法精,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痴突,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂蜓,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年辽装,在試婚紗的時候發(fā)現(xiàn)自己被綠了帮碰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拾积,死狀恐怖殉挽,靈堂內(nèi)的尸體忽然破棺而出丰涉,到底是詐尸還是另有隱情,我是刑警寧澤斯碌,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布一死,位于F島的核電站,受9級特大地震影響傻唾,放射性物質(zhì)發(fā)生泄漏投慈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一冠骄、第九天 我趴在偏房一處隱蔽的房頂上張望伪煤。 院中可真熱鬧,春花似錦猴抹、人聲如沸带族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阳堕,卻和暖如春跋理,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恬总。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工前普, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壹堰。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓拭卿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贱纠。 傳聞我的和親對象是個殘疾皇子峻厚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350