iOS音樂(lè)播放器開(kāi)發(fā)(擴(kuò)展)-歌詞格式

我是配圖

大家好 , 我是LEE. 一名有信仰的果粉Coder. ?

非常感謝大家利用自己寶貴的時(shí)間來(lái)閱讀我的文章 , 我并非大神 , 只是一枚努力成為大神的猿. 這篇文章主要寫(xiě)一個(gè)iOS系統(tǒng)下的音樂(lè)播放器 , 我會(huì)一步一步的去完成這個(gè)播放器的開(kāi)發(fā) , 并且會(huì)分析一些主要的技術(shù)點(diǎn)以及注意事項(xiàng)等 . 如果你是一個(gè)小白初學(xué)者 , 希望你看完后能夠?qū)δ愕奶嵘兴鶐椭?, 如果你是一個(gè)老司機(jī) , 希望可以得到你的指點(diǎn) , 有任何不妥的地方 歡迎指正 , 我會(huì)認(rèn)真改正 . 那么.. 開(kāi)車(chē)了~

前言

在開(kāi)發(fā)音樂(lè)播放器時(shí) , 針對(duì)歌詞的處理是必不可少的 , 而要想解析歌詞得到我們需要的數(shù)據(jù) , 首先就要了解歌詞數(shù)據(jù)的構(gòu)成格式 , 下面為大家簡(jiǎn)單介紹幾種常見(jiàn)的歌詞格式.

格式分析

當(dāng)今互聯(lián)網(wǎng)上 , 我們常見(jiàn)的歌詞格式有 LRC、TRC(天天動(dòng)聽(tīng)歌詞)、KRC(KuGou ResourCe , 酷狗資源文件)和 QRC(QQ音樂(lè)歌詞) . 下面我為大家分析比較這些歌詞格式.

LRC 格式

LRC 歌詞格式是世界上最通用的歌詞格式 , 沒(méi)有之一 . 它是最基本的歌詞格式 , 幾乎沒(méi)有支持其他歌詞格式而不支持這個(gè)歌詞格式的播放器 . LRC 歌詞格式的特性就是——簡(jiǎn)單.

      [ti:青花瓷]
      [ar:周杰倫]
      [al:我很忙]
      [00:00.00]青花瓷 - 周杰倫
      [00:20.89]素胚勾勒出青花筆鋒濃轉(zhuǎn)淡
      [00:25.58]瓶身描繪的牡丹一如你初妝
      [00:29.96]冉冉檀香透過(guò)窗心事我了然
      [00:34.43]宣紙上 走筆至此擱一半
      [00:38.99]釉色渲染仕女圖韻味被私藏
      [00:43.33]而你嫣然的一笑如含苞待放
      [00:47.80]你的美一縷飄散
      [00:50.27]去到我去不了的地方
      [00:56.40]天青色等煙雨 而我在等你
      [01:00.43]炊煙裊裊升起 隔江千萬(wàn)里
      [01:05.34]在瓶底書(shū)漢隸仿前朝的飄逸
      [01:09.37]就當(dāng)我為遇見(jiàn)你伏筆

簡(jiǎn)單分析一下
首先有一些記錄歌曲及歌詞信息的東東 , 我們將其稱(chēng)作"ID 標(biāo)簽" (ID Tags) , 它可以包含歌曲名 (ti) , 專(zhuān)集 (al) , 歌手 (ar) , 歌詞創(chuàng)建者 (by) , 歌詞延遲調(diào)整 (offset) 等信息.

下面是主體部分 , LRC 格式為每行歌詞指定起始時(shí)刻 , 格式為

      [分鐘:秒.百分秒].

以上說(shuō)的是簡(jiǎn)單的 LRC 格式 也是我們最常見(jiàn)的格式 . 事實(shí)上 , 還有一些對(duì)其進(jìn)行了擴(kuò)展和完善 , 比如有一種擴(kuò)展的簡(jiǎn)單格式和一種增強(qiáng)格式.

擴(kuò)展的 LRC 格式在原來(lái)的基礎(chǔ)上支持 "男女合唱標(biāo)記" . 語(yǔ)法是: 在歌詞正文前添加 "M:" (男) 、"F:" (女) 或 "D:" (合) . 下面就是一個(gè)示例 . 但是 , 這種格式并沒(méi)有被廣泛使用.

    [00:10.00]使用默認(rèn)的顏色應(yīng)該是藍(lán)色
    [00:12.35]F: 這行一般顯示為紅色
    [00:15.10]M: 男聲開(kāi)始了
    [00:20.05]繼續(xù)男聲
    [00:25.45]D: 合唱部分開(kāi)啟,一般為綠色

增強(qiáng) LRC 格式支持在原格式基礎(chǔ)上加入了逐字精準(zhǔn)支持 . 通過(guò)在每個(gè)字 (也可以是詞) 外添加額外的時(shí)刻標(biāo)簽<分鐘:秒.百分秒> . 這種格式的設(shè)計(jì)者的主頁(yè)已經(jīng)掛掉了 , 恕我不能提供更多信息和具體的示例 . 維基百科給的示例如下:

    [mm:ss.xx] <mm:ss.xx> 第一行第一個(gè)詞 <mm:ss.xx> 第一行第二個(gè)詞 <mm:ss.xx> ... 第一行最后一個(gè)詞 <mm:ss.xx>
    [mm:ss.xx] <mm:ss.xx> 第二行第一個(gè)詞 <mm:ss.xx> 第二行第二個(gè)詞 <mm:ss.xx> ... 第二行最后一個(gè)詞 <mm:ss.xx>...
    [mm:ss.xx] <mm:ss.xx> 最后一行第一個(gè)詞 <mm:ss.xx> 最后一行第二個(gè)詞 <mm:ss.xx> ... 最后一行最后一個(gè)詞 <mm:ss.xx>

TRC 格式

TRC 格式是由天天動(dòng)聽(tīng)制定的一種歌詞格式 , 可以看作是對(duì) LRC 格式的擴(kuò)展-----為什么我這樣說(shuō)呢 ? 請(qǐng)看下面我從一 TRC 文件中從頭摘取的文本.

    [ar:胡彥斌]
    [ti:當(dāng)你要離開(kāi)的時(shí)候]
    [al:]
    [total:243000]
    [offset:0]
    [by:ttpod]
    [00:16.54]<250>當(dāng)<300>你<1852>要<249>離<452>開(kāi)<201>的<451>時(shí)<3801>候
    [00:24.32]<200>我<200>們<1201>走<250>過(guò)<250>了<251>無(wú)<350>數(shù)<350>個(gè)<600>路<3851>口

因此 , 我們可以下結(jié)論 , TRC 格式在 LRC 格式基礎(chǔ)上 , 歌詞正文中每個(gè)字的前面增加了時(shí)間標(biāo)記<毫秒數(shù)> , 每個(gè)字連續(xù)解析 , 支持了逐字精準(zhǔn) . (上文中"字"可理解為詞) , 這在遇到英文時(shí)尤其有用.


KRC 格式

KRC 是酷狗公司推出的專(zhuān)利歌詞格式 , 主要是支持了逐字精準(zhǔn) , 解決了所謂“歌詞顯示不準(zhǔn)確”的問(wèn)題 . 酷狗在很久之前在用 LRC 歌詞做卡拉 OK 效果 , 但由于 LRC 的特性問(wèn)題 , 在某一行中 , 每個(gè)字的持續(xù)時(shí)間只能是平均分配的 (直到現(xiàn)在,還有不少播放器是這樣做的) , 想必是后來(lái)實(shí)在看不下去了吧 . 這里值得說(shuō)一點(diǎn) , 酷狗的歌詞是經(jīng)過(guò)加密處理的 , 直接打開(kāi)會(huì)看到全部都是亂碼 , 不過(guò)這種事還是難不倒萬(wàn)能的天朝攻城獅 , 下面是解密后的歌詞片段:

    [id:$00000000]
    [ar:信樂(lè)團(tuán)]
    [ti:北京一夜]
    [by:帥比LEE]
    [hash:766fe295bf2722a9ede2abdd61d580c1]
    [total:278438]
    [sign:大家去北京玩一夜吧!!!!]
    [53883,3092]<0,632,0>One <632,784,0>Night <1416,372,0>in <1788,548,0>北<2336,755,0>京
    [56675,3539]<0,560,0>我<560,416,0>留<976,392,0>下<1368,412,0>許<1780,392,0>多<2172,1366,0>情
    [59914,2577]<0,549,0>不<549,276,0>管<825,252,0>你<1077,214,0>愛(ài)<1291,182,0>與<1473,212,0>不 <1685,887,0>愛(ài)
    [62191,3344]<0,560,0>都<560,210,0>是<770,210,0>歷<980,204,0>史<1184,202,0>的<1386,564,0>塵<1950,1387,0>埃

通過(guò)觀察我們可以看出 , KRC 格式記錄了歌詞的制作者名稱(chēng)、ID、個(gè)性簽名 , 歌曲的基本信息也有在列 , 還包括歌曲長(zhǎng)度和歌曲 hash 值 . 歌曲的 hash 值是實(shí)現(xiàn)打開(kāi)歌詞文件就抓取對(duì)應(yīng)歌曲要求的重要信息 . 而在正文中 , 語(yǔ)法為:

    [此行開(kāi)始時(shí)刻距0時(shí)刻的毫秒數(shù),此行持續(xù)的毫秒數(shù)]<0,此字持續(xù)的毫秒數(shù),0>歌<此字開(kāi)始的時(shí)刻距此行開(kāi)始時(shí)刻的毫秒數(shù),此字持續(xù)的毫秒數(shù),0>詞<此字開(kāi)始的時(shí)刻距此行開(kāi)始時(shí)刻的毫秒數(shù),此字持續(xù)的毫秒數(shù),0>正<此字開(kāi)始的時(shí)刻距此行開(kāi)始時(shí)刻的毫秒數(shù),此字持續(xù)的毫秒數(shù),0>文

由此可見(jiàn) , 酷狗的歌詞格式也是支持逐字同步的 , 只不過(guò)語(yǔ)法中最后那個(gè) 0 我是真不懂啥意思 - - , 可能是延遲偏移毫秒數(shù)或者是巴拉巴拉什么的.


QRC 格式

QRC 是QQ音樂(lè)推出的專(zhuān)用歌詞格式 , 同樣支持逐字精準(zhǔn) , 先前 QRC 格式是一種比較友好和開(kāi)放的格式 , 但是現(xiàn)在.....萬(wàn)惡的加密 , 它現(xiàn)在變成了一種可以說(shuō)比 KRC 還封閉的格式 . 現(xiàn)在我們既不能查看到其源碼 , 也無(wú)法制作這種格式的歌詞 . 下面是早年間存在于世的 QRC歌詞片段:

    [1790,2062]那(1790,375)一(2165,309)年  (2474,315)汪(2789,311)蘇(3100,314)瀧(3414,438)
    [5052,3516]作(5052,252)曲(5304,248):(5552,252)汪(5804,253)蘇(6057,247)瀧 

解析語(yǔ)法為 (方括號(hào)內(nèi)表示一行的 , 小括號(hào)表示每個(gè)字的) :

    [開(kāi)始時(shí)間ms,持續(xù)時(shí)間ms]歌詞 (開(kāi)始時(shí)間ms , 持續(xù)時(shí)間ms) 

感覺(jué)和 KRC 很像有木有 ? 現(xiàn)在具體是什么樣 只有QQ音樂(lè)項(xiàng)目組知道了.


總結(jié)

LRC 最簡(jiǎn)單 , 最廣泛 , 但是沒(méi)有逐字精準(zhǔn) . TRC、KRC、QRC 支持逐字精準(zhǔn) , 但是其中 KRC 和 QRC 格式不開(kāi)放 . 從這點(diǎn)上看 , TRC 是不錯(cuò)的選擇 . 但是 KRC 歌詞的資源更多 (應(yīng)僅次于 LRC 的資源 ) , 既然都已經(jīng)出現(xiàn)了解析方法 , 利用下應(yīng)該也是可以的 (但 KRC 格式擁有專(zhuān)利 , 謹(jǐn)慎喲) , LRC 總歸來(lái)說(shuō),是只能滿(mǎn)足簡(jiǎn)單需求的啦 , 如果你只是用于研究寫(xiě)寫(xiě)demo , TRC 和 LRC 就夠了.

最后提醒大家一下 , 如果你正在做一個(gè)音樂(lè)播放器類(lèi)的APP , 那么你一定要注意解析歌詞時(shí)的容錯(cuò)處理 , 千萬(wàn)別因?yàn)楦柙~數(shù)據(jù)有一點(diǎn)小錯(cuò)誤而導(dǎo)致你整個(gè)APP蹦掉 , 血淋淋的教訓(xùn).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容