# LRC文件格式

非常感谢 [thecasttim](https://gitee.com/thecasttim) 的 [LrcParser](https://gitee.com/thecasttim/lrc-parser) 项目，为此项目提供了非常大的参考。可以说，本项目就是基于它进行了进一步的修改而开发的。本文件基于其编写的[README.md](https://gitee.com/thecasttim/lrc-parser/blob/master/README.md)而改写而来。

LRC是英文**L**y**r**i**c**，即歌词的缩写，被用做歌词文件的扩展名。以`.lrc`为扩展名的歌词文件可以在各类有相关支持的数码播放器中与所播放之歌曲同步显示歌词。此类文件是一种包含由“标签（tag）”所标记的时间信息的、基于纯文本的歌词专用格式。大部分MP3播放器显示歌词的方法亦为LRC格式的歌词文件，此类文件也是当前网络上最流行的一种歌词格式。

## 元素

LRC文件以 **标签** （Tag）来进行控制整个歌词整体信息。标签一共有两种：*ID标签*（ID-Tag） 和 *时间标签*（Time-Tag）

### **ID标签**

LRC格式歌词的**ID标签**存储了歌曲的元信息。其可能位于其他标签之前，亦可以在任意位置，在这里，我建议在编辑文件时，把**有关歌曲信息的ID标签**均置于整个文件的最前端，因为部分播放器可能采用的是惰性文件读取的方法读词，即按行读取歌词文件，此时将无法正常显示相关歌曲信息。

标准的LRC歌词文件中，**ID标签**包括：

```wiki
[ar:演唱者]
[al:本歌所在的专辑]
[ti:本歌的标题]
[au:歌词作者]
[length:本歌的长度]
[by:此LRC文件的创建者]
[re:创建此LRC文件的播放器或编辑器]
[ve:程序的版本]
[offset:时间补偿值]（其单位是毫秒，正值表示整体提前，负值相反。这是用于总体调整显示快慢的）
```

例如：

```wiki
[ar:丌幂]
[al:灵]
[ti:仁]
[au:羿秋]
[length:02:33]
[by:金羿]
[re:Python Lyric]
[ve:0.0.1]
```

### **时间标签**

LRC具有**单句标签**（简单格式）和**字词标签**（增强格式）两种时间标记方式，前者是必须的，后者是可拓展的。在时间标签所标记处，是要显示的歌词。

同上述ID标签的理，尽量按照时间顺序排序歌词，你永远也无法预测下一个播放器会偷怎样的懒。

***单句标签***即每一个时间标签对应的是一行歌词，其格式可以为：

```wiki
[mm:ss.fff]歌词
[mm:ss.xx]歌词
[hh:mm:ss]歌词
[hh:mm:ss.fff]歌词
[hh:mm:ss.xx]歌词
[mm:ss]歌词
[mm:ss.xx][mm:ss.xx][mm:ss.xx]重复出现的歌词
```

其中，正规的写法是前五个，最正规的是第一个，形如 **[mm:ss.fff]** 的是时间标签，**歌词** 为显示的单句歌词。在部分编辑器中，无需精确时间时，会省略最后的`xx`部分，但这不是正规写法。在时间标签中 **hh** 是小时数，**mm** 为分钟数, **ss** 为秒数，**fff** 和 **xx** 所表示的都是精确的时间数值，单位不同，详见下表。

在上面示例中的最后一个出现重复的歌词，那么说明这一行歌词在前面n个标签声明的时间点都有出现，虽然这是一个节省文件大小的好方法，但是现在都*2023*年了，省这几个字节有必要吗？而且这也是一种不规范的写法，**尽量避免**。

|标记|说明|单位|
|---|---|---|
|**hh**|距离歌曲开始时的小时数，最大为99，不知道有没有劣质的播放器会有超限的情况，但是我猜一首歌唱九十多小时的人是不存在的；连电影字幕也不可能吧。|**时**|
|**mm**|距离歌曲开始时的分钟数，当不存在第一个**hh**参数时，最大为99，不知道有没有劣质的播放器会有超限的情况，但是我猜一首歌唱一个半多小时的人是不存在的；除非你用LRC文件来存的是电影字幕。|**分**|
|**ss**|距离当前分钟开始时的秒数，最大为59，部分劣质的编辑器会在60的边界反复横跳。|**秒**|
|**xx**|距离当前秒开始时的百分之一秒数，最大为99，一定不能超限！否则就是**fff**标记了。|**十毫秒** 或曰 **百分之一秒**|
|**fff**|距离当前秒开始时的毫秒数，最大为999，同理，鬼知道有没有超限的情况，但是咱写的时候千万别乱来啊。|**毫秒**|

例如：
```wiki
[00:10.00] 第一行歌词（精确到十毫秒）
[00:10.001] 第二行歌词（精确到一毫秒）
[00:00:12.123] 第三行歌词（没必要的写法）
[00:18] 第四行歌词（精确到一秒的不标准的写法）
...
[mm:ss.xx] 最后一行歌词
```

> 注意！
>
> 还有一种其实更不负责任的写法，它与小时的解析互相冲突了。就是 \[mm:ss:xx\]。
>
> 这里不做讨论了，这种再说就没意思了，大家懂的都懂。

***歌词***部分，由于一些卡拉OK播放器的需要，可以设置男女对唱的标签：

+ M：男
+ F：女
+ D：合唱

例如：
```wiki
[00:12.00]第一行歌词
[00:15.00]F: 第二行歌词
[00:16.50]M: 第三行歌词
[00:17.20]第四行歌词
[00:18.00]D: 第五行歌词
[00:22.20] 第六行歌词
```

***字词标签***是夹在歌词部分之中的，其对简单LRC格式进行了增强，可以标注单个词的出现时间。其格式应为：

```wiki
[mm:ss.xx]<mm:ss.xx>第1行第1个词<mm:ss.xx>第1行第2个词<mm:ss.xx> ... 第1行最后的词<mm:ss.xx>
[mm:ss.xx]<mm:ss.xx>第2行第1个词<mm:ss.xx>第2行第2个词<mm:ss.xx> ... 第2最后的词<mm:ss.xx>
...
[mm:ss.xx]<mm:ss.xx>最后1行第1个词<mm:ss.xx>最后1行第2个词<mm:ss.xx>...最后1行最后的词<mm:ss.xx>
```
在每个词之后的**字词时间标签**标记了从上一个字词标签到本字词标签中的词所在歌曲中的出现时间，字词标签不可像前面我说过“**尽量避免**”的那个单句标签那样进行叠加使用。

一个字词时间标签的格式，标准的长这样：`<mm:ss.xx>` 或者 `<mm:ss.fff>` 之类的，同理上面单句标签的理，就是把方括号换成了尖括号，或者说把英文中括号换成了一对大于小于号，不论怎么说就这样，当然也有一大打不规范写法，这里就不说了。





## 参考

+ LRC文件格式

  https://en.wikipedia.org/wiki/LRC_(file_format)

  https://blog.csdn.net/beijingak/article/details/7601534

  https://www.cnblogs.com/tocy/p/subtitle-format-lyric.html

  https://baike.baidu.com/item/lrc/46935

+ LRC歌词开发标准参考

  https://www.cnblogs.com/lbnnbs/p/4781993.html

+ LRC生成器

  http://www.lrcgenerator.com/


