浅谈动感歌词-歌词分析篇

1引言

关于动感歌词,我们都不陌生,最常见的就是去唱K时,MV上面的歌词,还有就是酷狗、天天动听和QQ音乐等播放器的歌词,它们都是属于动态歌词,它们都是精确到每个【字】,这大大提高了用户的体验。如果一个菜鸟想自己实现动感歌词该怎么办?是的,下面我将从我自己的一些自身经历来谈一下,怎样实现动态歌词.

我记得当时自己第一次弄java swing版本的音乐播放器,遇到歌词模块时,第一时间就是百度。但是度娘给我显示的答案100%都是lrc的歌词(lrc歌词不是精确到字的,只精确到行),可见lrc历史悠久,深深影响几代人啊。其实当时,我也不喜欢用lrc歌词,不过没办法啊!像当时流行的酷狗播放器,歌词还是加密的,你看不了。好了,等到好不容易知道了歌词的内容,也解析出来了,就是不知怎样编写代码才能在界面上面显示出动感歌词的效果。是的,就是因为这一大堆的不知道,不懂,阻碍了我对动态歌词的进一步了解。

2动态歌词格式

下面将对现在流行的一些动感歌词进行分析,因为我们要实现动感歌词的生成和显示,就必须要先了解,它们的歌词文件究竟保存了一些什么内容,为什么可以精确到每个【字】。

2.1KSC歌词

这种歌词格式应该是我最早就接触的了,就是卡拉OK歌词,它的歌词内容是不加密的,真是帮了大忙。是的,在我走投无路的时候,是它拉了我一把,让我对动感歌词恢复了热情,当时知道有这种歌词格式时,我还特意去下载了一个《小灰熊卡拉ok字幕制作软件》来制作歌词。话不多说,看一下这种歌词的格式是怎样的:

karaoke.songname := '你要的爱'; 

karaoke.singer := '戴佩妮';

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');

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 }'); ## 2.2TRC歌词 ## 该歌词是天天动听使用的动感歌词,由于网上的资源比较少,我直接引用我参考的博客内容

[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}>字 ## 2.3KRC歌词 ## 该歌词是酷狗使用的动感歌词,无错,加密的。不过网上早已有人破解了,下面给出破解的文本内容,该歌词不仅是加密,还对歌词内容进行了压缩处理。

[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>{字}

2.4HRCX歌词

该歌词是我在弄《乐乐音乐》音乐播放器时,自定义的一种歌词格式(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}>','{歌词}','<{字持续时间}><{字持续时间}>');

#3总结与分析# 不论动感歌词是什么格式,内容怎样变,它们都是可以归纳为几个属性来设计实体类:

3.1标签

[ar:歌手名]、[ti:歌曲名]、[by:编辑者(指歌词的制作人)]、[offset:时间补偿值] (其单位是毫秒,正值表示整体提前,负值相反。这是用于总体调整显示快慢的)[total:歌曲时间长度]、

3.2行开始时间

3.3行结束时间

3.4行歌词

3.5歌词每个字持续时间

4实体类设计

附上歌词实体类、行歌词实体类、标签实体类

##4.1歌词实体(LyricsInfo) ##

4.2行歌词实体(LyricsLineInfo)

4.3标签实体(LyricsTag)

5参考博客

iOS音乐播放器开发(扩展)-歌词格式

http://blog.csdn.net/qingzi635533/article/details/30231733

6最后

下一篇,将介绍动态歌词的生成。如有侵权,麻烦告知。

Written on January 9, 2017