一、lrc文件有什么作用

lrc文件就是一个文本文件,用来记录歌曲的歌词信息,使得播放歌曲时能够让歌词与声音同步显示,类似于电影字幕那种效果。

心情很丧时我们会听首歌陶冶一下情操,不知你是否注意过音乐播放软件播放音乐时歌词信息,这是酷我音乐的歌词播放界面:

当前正在播放的这一句歌词会被高亮显示,从上面这幅图我们能够看出来,这个歌词文件至少记录了什么时间播放哪一句歌词,这些信息都是放在lrc文件中的,一个lrc文件的格式大致如下:

[al:本歌所在的唱片集]
[ar:演出者-歌手]
[au:歌詞作者-作曲家]
[by:此LRC文件的创建者]
[offset:+/- 以毫秒为单位加快或延後歌詞的播放]
[re:创建此LRC文件的播放器或编辑器]
[ti:歌词(歌曲)的标题]
[ve:程序的版本]
[mm:ss.xx]歌词正文
...

[mm:ss.xx]歌词正文,mm表示从开始到现在的分钟数,ss表示从开始到现在的描述,xx表示n*10毫秒,精度是10毫秒。

二、LRC解析器

看到这个格式这么简单,便尝试写一个简单的格式解析器,文件结构参考维基百科的定义。

Lrc.java:

  1. package cc11001100.music;
  2.  
  3. import lombok.Data;
  4.  
  5. import java.util.Map;
  6. import java.util.TreeMap;
  7.  
  8. /**
  9. * @author CC11001100
  10. */
  11. public class Lrc {
  12.  
  13. // 唱片集
  14. private String album;
  15. // 演唱者
  16. private String artist;
  17. // 歌词作者
  18. private String author;
  19. // 此LRC文件的创建者
  20. private String by;
  21. // 创建此LRC文件的播放器或编辑器
  22. private String re;
  23. // 歌词标题
  24. private String title;
  25. // 程序的版本
  26. private String ve;
  27.  
  28. // 歌词正文
  29. private Map<String, String> lyric;
  30.  
  31. public Lrc() {
  32. lyric = new TreeMap<>();
  33. }
  34.  
  35. public String getAlbum() {
  36. return album;
  37. }
  38.  
  39. public void setAlbum(String album) {
  40. this.album = album;
  41. }
  42.  
  43. public String getArtist() {
  44. return artist;
  45. }
  46.  
  47. public void setArtist(String artist) {
  48. this.artist = artist;
  49. }
  50.  
  51. public String getAuthor() {
  52. return author;
  53. }
  54.  
  55. public void setAuthor(String author) {
  56. this.author = author;
  57. }
  58.  
  59. public String getBy() {
  60. return by;
  61. }
  62.  
  63. public void setBy(String by) {
  64. this.by = by;
  65. }
  66.  
  67. public String getRe() {
  68. return re;
  69. }
  70.  
  71. public void setRe(String re) {
  72. this.re = re;
  73. }
  74.  
  75. public String getTitle() {
  76. return title;
  77. }
  78.  
  79. public void setTitle(String title) {
  80. this.title = title;
  81. }
  82.  
  83. public String getVe() {
  84. return ve;
  85. }
  86.  
  87. public void setVe(String ve) {
  88. this.ve = ve;
  89. }
  90.  
  91. public Map<String, String> getLyric() {
  92. return lyric;
  93. }
  94.  
  95. public void setLyric(Map<String, String> lyric) {
  96. this.lyric = lyric;
  97. }
  98. }

LrcParser.java:

  1. package cc11001100.music;
  2.  
  3. import cc11001100.acl.ip.IpAcl;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.serializer.SerializerFeature;
  6. import org.apache.commons.io.FileUtils;
  7. import org.apache.commons.lang.StringUtils;
  8.  
  9. import java.io.File;
  10. import java.io.IOException;
  11. import java.util.Collections;
  12. import java.util.List;
  13.  
  14. import static com.alibaba.fastjson.JSON.toJSONString;
  15.  
  16. /**
  17. * 用于解析LRC歌词
  18. *
  19. * @author CC11001100
  20. */
  21. public class LrcParser {
  22.  
  23. public static Lrc parse(List<String> lineList) {
  24. Lrc lrc = new Lrc();
  25. for (String line : lineList) {
  26. if (StringUtils.isBlank(line)) {
  27. continue;
  28. }
  29. line = line.toLowerCase();
  30. // 唱片集
  31. if (line.startsWith("[al:")) {
  32. lrc.setAlbum(line.substring(4, line.length() - 1));
  33. } else if (line.startsWith("[ar:")) {
  34. // 演唱者
  35. lrc.setArtist(line.substring(4, line.length() - 1));
  36. } else if (line.startsWith("[au:")) {
  37. // 歌词作者
  38. lrc.setAuthor(line.substring(4, line.length() - 1));
  39. } else if (line.startsWith("[by:")) {
  40. // LRC制作者
  41. lrc.setBy(line.substring(4, line.length() - 1));
  42. } else if (line.startsWith("[re:")) {
  43. // 此LRC文件的创建者或编辑器
  44. lrc.setRe(line.substring(4, line.length() - 1));
  45. } else if (line.startsWith("[ti:")) {
  46. // 歌词标题
  47. lrc.setTitle(line.substring(4, line.length() - 1));
  48. } else if (line.startsWith("[ve:")) {
  49. // 程序的版本
  50. lrc.setVe(line.substring(4, line.length() - 1));
  51. } if (line.startsWith("[ver:")) {
  52. // 程序的版本
  53. lrc.setVe(line.substring(5, line.length() - 1));
  54. } else {
  55. int delimiterIndex = line.indexOf("]");
  56. String time = line.substring(1, delimiterIndex);
  57. String lrcContent = line.substring(delimiterIndex + 1);
  58. lrc.getLyric().put(time, lrcContent);
  59. }
  60. }
  61. return lrc;
  62. }
  63.  
  64. public static void main(String[] args) throws IOException {
  65.  
  66. List<String> lineList = FileUtils.readLines(new File("H:/KwDownload/Lyric/陈鸿宇-理想三旬.lrc"), "GBK");
  67. Lrc lrc = parse(lineList);
  68. System.out.println(toJSONString(lrc, SerializerFeature.PrettyFormat));
  69.  
  70. }
  71.  
  72. }

相关资料:
1. LRC格式 - 维基百科

.

lrc歌词文件格式的更多相关文章

  1. 浅析LRC歌词文件

    [时间:2018-12] [状态:Open] [关键词:字幕,LRC,歌词,lyric,文件格式] 0 引言 几年前(2010年左右),网络音乐流行与免费的时代,网上有大量的mp3,使用比较常见的播放 ...

  2. Java使用正则表达式解析LRC歌词文件

    LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持. lrc歌词文本中含有两类标签: 1.标识标签(ID-tags) [ar:艺人名] [ti:曲名] [al:专辑名] [by:编者(指编辑LRC ...

  3. Lrc歌词批量下载助手 MP3歌词批量下载助手

    Lrc歌词批量下载助手  MP3歌词批量下载助手   易歌词的服务器已经挂掉,各个主流播放器已不提供明确的下载Lrc服务,当上G的MP3文件遇上苦逼的播放器,二缺就诞生了!本软件就是在这种背景下诞生的 ...

  4. 如何将lrc歌词文件批量转换为ANSI编码?

    有些MP3.MP4或学习机只能播放ANSI编码的歌词文件,可是从网站上下载的歌词大多是UTF-8或者其它机器支持不了的编码,如何批量将这些lrc歌词文件转换成ANSI编码的文件呢? 工具/原料 萍客T ...

  5. Python脚本之Lrc歌词去时间轴转Txt文件,附带酷狗音乐APP关联已有krc歌词

    一.Lrc歌词去时间轴转Txt文件 环境:Python2.7.x, Mac(Windows需装cygwin环境,当然你也可以自己改代码,Python新手,勿喷) # -*- coding: UTF-8 ...

  6. c#解析Lrc歌词文件

    看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下, 首先来了解下Lrc文件 时间格式: 1.标准格式: [分钟:秒.毫秒] 歌词 注释:括号.冒号.点号全都要求 ...

  7. Lrc歌词-开发标准

    LRC歌词是在其程序当中实现的专门用于MP3等歌词同步显示的标签式的纯文本文件,如今已经得到了广泛的运用.现就LRC歌词文件的格式规定详细说明,已供程序开发人员参考. LRC文件是纯文本文件,可以用记 ...

  8. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  9. 怎样编辑LRC歌词

    恭喜恭喜歌词 唐嫣 - 音乐巴士 http://www.yy8844.cn/geci/mswcn/nvunns.shtml 恭喜恭喜歌词感谢 音乐巴士 珍妮 编辑歌词匹配时间为: 03 分 06 秒 ...

随机推荐

  1. Arcengine效率探究之一——属性的读取(转载)

    http://blog.csdn.net/lk103852503/article/details/6566652 在写一个对属性表的统计函数时,发现执行速度奇慢无比,百思不得其解,其实算法并不复杂,后 ...

  2. CodeMirror mode编写

    Writing CodeMirror Modes Modes typically consist of a single JavaScript file. This file defines, in ...

  3. opencv2 用imwrite 抽取并保存视频图像帧

    最近在写一个车辆检测程序,程序中需要获取图像帧,并保存为图片,且放到指定目录中去,我在网上查了很多发现都是opencv1的有关操作,没有opencv2的操作,我参考网上的例子,结合着用opencv2新 ...

  4. 淘宝店铺模板开发SDK2.0下载安装图文教程

    使用TortoiseSVN Checkout TAE SDK2.0 废话少说,切入主题: 1.在http://tortoisesvn.net/downloads.html上下载TortoiseSVN ...

  5. C#简述(二)

    详情请参考:http://www.runoob.com/csharp/csharp-operators.html 1.C# 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 ...

  6. Maven 学习笔记——Maven环境配置(1)

    在学习Selenium的过程中,接触到了Maven(项目管理工具),不至于学一路忘一路,左耳朵进右耳多出,还是决定边学边记录,毕竟听的不如 看的,看的不如写的吗.首先学一样东西,肯定得明确学的是什么, ...

  7. [转帖]SSL/TLS/WTLS原理

    SSL/TLS/WTLS原理 作者:yawl < yawl@nsfocus.com >主页:http://www.nsfocus.com日期:2001-02-19 一 前言 首先要澄清一下 ...

  8. IIS 下 搭建简单的FTP服务器

    1. 修改用户策略, 创建简单用户密码 命令行输入 gpedit.msc 打开组策略 位置 2. 创建一个FTP使用的用户 net user zhaobsh Test6530 /add 3. 安装II ...

  9. JS animate动画

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  10. hexo d 报错‘fatal: could not read Username for 'https://github.com': No error’

    问题描述 今天早上,一如往常的往在github上创建的hexo博客上传文章,结果报错 'fatal: could not read Username for 'https://github.com': ...