關於動感歌詞,咱們都不陌生,最多見的就是去唱K時,MV上面的歌詞,還有就是酷狗、每天動聽和QQ音樂等播放器的歌詞,它們都是屬於動態歌詞,它們都是精確到每一個【字】,這大大提升了用戶的體驗。若是一個菜鳥想本身實現動感歌詞該怎麼辦?是的,下面我將從我本身的一些自身經從來談一下,怎樣實現動態歌詞.java
我記得當時本身第一次弄java swing版本的音樂播放器,遇到歌詞模塊時,第一時間就是百度。可是度娘給我顯示的答案100%都是lrc的歌詞(lrc歌詞不是精確到字的,只精確到行),可見lrc歷史悠久,深深影響幾代人啊。其實當時,我也不喜歡用lrc歌詞,不過沒辦法啊!像當時流行的酷狗播放器,歌詞仍是加密的,你看不了。好了,等到好不容易知道了歌詞的內容,也解析出來了,就是不知怎樣編寫代碼才能在界面上面顯示出動感歌詞的效果。是的,就是由於這一大堆的不知道,不懂,阻礙了我對動態歌詞的進一步瞭解。app
下面將對如今流行的一些動感歌詞進行分析,由於咱們要實現動感歌詞的生成和顯示,就必需要先了解,它們的歌詞文件究竟保存了一些什麼內容,爲何能夠精確到每一個【字】。優化
這種歌詞格式應該是我最先就接觸的了,就是卡拉OK歌詞,它的歌詞內容是不加密的,真是幫了大忙。是的,在我走投無路的時候,是它拉了我一把,讓我對動感歌詞恢復了熱情,當時知道有這種歌詞格式時,我還特地去下載了一個《小灰熊卡拉ok字幕製做軟件》來製做歌詞。話很少說,看一下這種歌詞的格式是怎樣的:加密
karaoke.songname := '你要的愛'; spa
karaoke.singer := '戴佩妮';.net
karaoke.add('00:03.298', '00:06.771', '雖然常常夢見你', '467,215,195,936,282,568,810'); 設計
karaoke.add('00:09.571', '00:12.105', '仍是毫無頭緒', '245,164,211,261,451,1202');karaoke.add('00:14.809', '00:16.626', '外面正在下着雨', '271,200,195,179,271,266,435');blog
karaoke.add('00:17.245', '00:19.908', '今天是星期幾', '195,143,175,379,758,1013');資源
karaoke.add('00:20.492', '00:22.089', '[but ][i ][don`t ][know]', '179,190,286,942');開發
由其格式可知:行歌詞對英文和空格,都用了[]來包住,其實該歌詞解析起來,難度仍是挺大的。。。。
karaoke.songname := '{歌名}';
karaoke.singer := '{歌手}';
karaoke.add('{行開始時間}', '{行結束時間}', '{行歌詞}', '{每一個字持續的時間:單位爲 ms }');
該歌詞是每天動聽使用的動感歌詞,因爲網上的資源比較少,我直接引用我參考的博客內容
[ar:胡彥斌]
[ti:當你要離開的時候]
[al:]
[total:243000]
[offset:0]
[by:ttpod]
[00:16.54]<250>當<300>你<1852>要<249>離<452>開<201>的<451>時<3801>候
[00:24.32]<200>我<200>們<1201>走<250>過<250>了<251>無<350>數<350>個<600>路<3851>口
由其格式可知:字前面的數字,爲該字的持續時間。因爲沒有行結束時間,解析起來,仍是有點難度。
[ar:歌手名]、[ti:歌曲名]、[al:專輯名]、[by:編輯者(指歌詞的製做人)]、[offset:時間補償值] (其單位是毫秒,正值表示總體提早,負值相反。這是用於整體調整顯示快慢的)[total:歌曲時間長度]
[{行開始時間}]<{每一個字持續時間:單位ms}>{字}<{每一個字持續時間:單位ms}>字
該歌詞是酷狗使用的動感歌詞,無錯,加密的。不過網上早已有人破解了,下面給出破解的文本內容,該歌詞不只是加密,還對歌詞內容進行了壓縮處理。
[id:$00FF2B12]
[ar:李健]
[ti:美若黎明]
[by:]
[hash:e1c2628fad0a46f94df6b8b071df078f]
[al:]
[sign:]
[qq:]
[total:267096]
[offset:10000]
[language:eyJjb250ZW50IjpbXSwidmVyc2lvbiI6MX0=]
[1679,1550]<0,399,0>做<399,200,0>詞<599,250,0>:<849,301,0>李<1150,400,0>健
[3229,1650]<0,350,0>做<350,300,0>曲<650,350,0>:<1000,350,0>李<1350,300,0>健
由其格式可知:我表示 <0,350,0>最後一個0是什麼意思,我也不知道,可是這並不影響咱們對該歌詞的解析。。。。
[ar:歌手名]、[ti:歌曲名]、[al:專輯名]、[by:編輯者(指歌詞的製做人)]、[offset:時間補償值] (其單位是毫秒,正值表示總體提早,負值相反。這是用於整體調整顯示快慢的)[total:歌曲時間長度]、[sign:簽名]
[{行開始時間},{行持續時間}]<{字開始時間},{字持續時間},0>{字}<{字開始時間},{字持續時間},0>{字}
該歌詞是我在弄《樂樂音樂》音樂播放器時,自定義的一種歌詞格式(happy lyrics),它是能夠精確到【字】的。固然,我在生成該歌詞時,也對歌詞的內容進行了壓縮處理。下面給出解壓後的文本內容:
[ti:右手戒指];
[total:272706];
[ar:金海心];
[offset:0];
[by:HappyPlayer-PC];
haplayer.lrc('<1270,9630>','金海[心 ][- ]右手戒指','<1010,780,830,1410,800,1210,1410,910>');
haplayer.lrc('<18710,19810>','[la ][la ][la ]','<300,400,400>');
haplayer.lrc('<20020,22840><77150,79970><163120,165840><191920,194740>','是你夢中的女郎','<200,300,400,300,510,500,610><310,400,300,510,400,400,500><200,510,400,400,410,500,300><210,400,300,400,400,510,600>');
由其格式可知:歌詞內容方面參考了ksc歌詞,用[]來包住,將重複的歌詞(高潮部分)歸爲一行,這也算是一種優化。
[ar:歌手名]、[ti:歌曲名]、[by:編輯者(指歌詞的製做人)]、[offset:時間補償值] (其單位是毫秒,正值表示總體提早,負值相反。這是用於整體調整顯示快慢的)[total:歌曲時間長度]、
haplayer.lrc('<{行開始時間:單位ms},{行結束時間:單位ms}>','{歌詞}','<{字持續時間}>');
haplayer.lrc('<{行開始時間:單位ms},{行結束時間:單位ms}><{行開始時間:單位ms},{行結束時間:單位ms}>','{歌詞}','<{字持續時間}><{字持續時間}>');
不論動感歌詞是什麼格式,內容怎樣變,它們都是能夠概括爲幾個屬性來設計實體類:
[ar:歌手名]、[ti:歌曲名]、[by:編輯者(指歌詞的製做人)]、[offset:時間補償值] (其單位是毫秒,正值表示總體提早,負值相反。這是用於整體調整顯示快慢的)[total:歌曲時間長度]、
附上歌詞實體類、行歌詞實體類、標籤實體類
下一篇,將介紹動態歌詞的生成。若有侵權,麻煩告知。