KRC歌词解析原理及Android实现K歌动态歌词效果
KRC格式歌词是酷狗音乐播放器推出的一种动感歌词格式,全称KugouResourCe(酷狗资源文件)。以下是关于KRC格式歌词的详细介绍:
### 基本特点
* **高精度歌词** :可控制到每个字的时间,使歌词显示更精确,能实现卡拉 OK 字幕机效果,用户可跟着音乐节奏一边看歌词一边哼唱。
* **丰富的多媒体内容** :除了歌词文本,还包含图片、专辑信息等,增强用户体验,让用户更全面地了解歌曲。
* **自动下载歌曲** :在酷狗播放器中打开 KRC 文件时,会自动下载关联的歌曲文件,使歌曲传播更简便。
* **专有格式** :是酷狗播放器专用 lyrics 格式,其他播放器通常无法直接打开。
### 文件结构
* **头部信息** :文件开头的 4 字节 “krc1” 表示文件类型和版本号。
* **元数据部分** :包含歌曲的基本信息,如 `[ar:歌手名]` 表示演唱者,`[ti:歌曲名]` 表示歌曲标题,`[by:歌词作者]` 表示歌词作者,`[hash:哈希值]` 用于验证文件完整性,`[total:总时长]` 表示歌曲总时长,`[offset:偏移量]` 用于调整歌词显示时间偏移等。
* **歌词内容部分** :每行歌词的格式为 `[起始时间, 结束时间]<音符信息>歌词内容`,其中音符信息格式为 `<起始时间, 持续时间, 音符索引>`,用于控制歌词显示效果。
### 与 LRC 格式的对比
* **精度** :KRC 格式可控制到每个字的时间,而 LRC 格式只能控制到每一行的时间,在逐字显示歌词方面,KRC 精度更高。
* **内容** :KRC 文件除歌词外,还可包含图片和专辑信息,LRC 文件通常只包含歌词。
* **兼容性** :LRC 格式通用性更强,大多数音乐播放器都支持,KRC 格式仅在酷狗播放器中可用。
### 编辑方式
由于KRC文件是加密的,直接用文本编辑器打开 KRC 文件会显示乱码,需先解密得到明文。
以下是一段解密后的KRC歌词内容:
[ar:半阳]
[ti:我的将军啊]
[by:]
[hash:0805fbafc44fce9b267efae281d5dd8c]
[al:]
[sign:]
[qq:]
[total:138161]
[offset:0]
[language:eyJjb250ZW50IjpbXSwidmVyc2lvbiI6MX0=]
[357,959]<0,152,0>半<152,100,0>阳 <252,152,0>- <404,100,0>我<504,101,0>的<605,152,0>将<757,101,0>军<858,101,0>啊
[1316,608]<0,102,0>作<102,151,0>词<253,102,0>:<355,100,0>半<455,153,0>阳
[1924,709]<0,101,0>作<101,152,0>曲<253,101,0>:<354,153,0>半<507,202,0>阳
[2633,2176]<0,203,0>狼<203,354,0>烟<557,557,0>风<1114,707,0>沙<1821,355,0>口
[5215,2175]<0,203,0>还<203,347,0>请<550,260,0>将<810,350,0>军<1160,308,0>少<1468,303,0>饮<1771,404,0>酒
[7823,2329]<0,254,0>前<254,303,0>方<557,303,0>的<860,355,0>路<1215,253,0>不<1468,405,0>好<1873,456,0>走
[10507,2282]<0,253,0>我<253,306,0>在<559,302,0>家<861,356,0>中<1217,355,0>来<1572,305,0>等<1877,405,0>候
[13196,2223]<0,252,0>可<252,304,0>愿<556,604,0>柳<1160,709,0>下<1869,354,0>走
[15824,2273]<0,253,0>满<253,354,0>头<607,302,0>杨<909,355,0>花<1264,304,0>共<1568,302,0>白<1870,403,0>首
[18502,2327]<0,252,0>十<252,354,0>两<606,304,0>相<910,354,0>思<1264,356,0>二<1620,252,0>两<1872,455,0>酒
格式规则如下:
以下是解密后的KRC歌词文件格式中各字段的含义解释:
元数据部分
[ar:半阳]:表示歌曲的演唱者(Artist),这里是“半阳”。
[ti:我的将军啊]:表示歌曲的标题(Title),这里是“我的将军啊”。
[by:]:表示歌词作者,目前为空。
[hash:0805fbafc44fce9b267efae281d5dd8c]:表示文件的哈希值(Hash),用于验证文件的完整性,这里是一个32位的十六进制字符串。
[al:]:表示专辑名称,目前为空。
[sign:]:表示签名信息,目前为空。
[qq:]:表示QQ号码,目前为空。
[total:138161]:表示总时长(Total),单位为毫秒,这里为138161毫秒。
[offset:0]:表示偏移量(Offset),用于调整歌词显示的时间偏移,这里为0。
[language:eyJjb250ZW50IjpbXSwidmVyc2lvbiI6MX0=]:表示语言信息,这是一个Base64编码的字符串,解码后为{"content":[],"version":1},表示语言相关内容为空,版本为1。
歌词内容部分
每个歌词行的格式为:起始时间,结束时间<音符信息>歌词内容
起始时间:表示歌词行开始显示的时间,单位为毫秒。
结束时间:表示歌词行结束显示的时间,单位为毫秒。
<音符信息>:包含音符的起始时间、持续时间和音符索引,格式为<起始时间,持续时间,音符索引>,用于控制歌词的显示效果,如淡入淡出、颜色变化等。
歌词内容:表示具体的歌词文字。
例如:
[357,959]<0,152,0>半<152,100,0>阳 <252,152,0>- <404,100,0>我<504,101,0>的<605,152,0>将<757,101,0>军<858,101,0>啊
起始时间:357毫秒
结束时间:959毫秒
音符信息:包括多个音符的起始时间、持续时间和索引,如<0,152,0>表示起始时间为0,持续时间为152毫秒,音符索引为0。
歌词内容:半阳 - 我的将军啊
这些字段共同构成了KRC歌词文件的结构,用于在播放器中同步显示歌词内容,并支持各种视觉效果。
显示动态歌词的基本步骤:
1.根据密钥解密歌词,得到完整歌词字符串
2.根据换行符将完整字符串分割成每一行显示的歌词
3.根据当前播放时间先找到对应的行数,然后根据改行歌词每个字的起始时间和持续时间,计算出需要高亮的歌词位置(宽度)
Android 实现方式可参考开源歌词项目:HPLyrics