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参考博客
6最后
下一篇,将介绍动态歌词的生成。如有侵权,麻烦告知。