lrc歌詞檔案格式
阿新 • • 發佈:2018-11-11
一、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:
package cc11001100.music; import lombok.Data; import java.util.Map; import java.util.TreeMap; /** * @author CC11001100 */ public class Lrc { // 唱片集 private String album; // 演唱者 private String artist; // 歌詞作者 private String author; // 此LRC檔案的建立者 private String by; // 建立此LRC檔案的播放器或編輯器 private String re; // 歌詞標題 private String title; // 程式的版本 private String ve; // 歌詞正文 private Map<String, String> lyric; public Lrc() { lyric = new TreeMap<>(); } public String getAlbum() { return album; } public void setAlbum(String album) { this.album = album; } public String getArtist() { return artist; } public void setArtist(String artist) { this.artist = artist; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getBy() { return by; } public void setBy(String by) { this.by = by; } public String getRe() { return re; } public void setRe(String re) { this.re = re; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getVe() { return ve; } public void setVe(String ve) { this.ve = ve; } public Map<String, String> getLyric() { return lyric; } public void setLyric(Map<String, String> lyric) { this.lyric = lyric; } }
LrcParser.java:
package cc11001100.music; import cc11001100.acl.ip.IpAcl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; import static com.alibaba.fastjson.JSON.toJSONString; /** * 用於解析LRC歌詞 * * @author CC11001100 */ public class LrcParser { public static Lrc parse(List<String> lineList) { Lrc lrc = new Lrc(); for (String line : lineList) { if (StringUtils.isBlank(line)) { continue; } line = line.toLowerCase(); // 唱片集 if (line.startsWith("[al:")) { lrc.setAlbum(line.substring(4, line.length() - 1)); } else if (line.startsWith("[ar:")) { // 演唱者 lrc.setArtist(line.substring(4, line.length() - 1)); } else if (line.startsWith("[au:")) { // 歌詞作者 lrc.setAuthor(line.substring(4, line.length() - 1)); } else if (line.startsWith("[by:")) { // LRC製作者 lrc.setBy(line.substring(4, line.length() - 1)); } else if (line.startsWith("[re:")) { // 此LRC檔案的建立者或編輯器 lrc.setRe(line.substring(4, line.length() - 1)); } else if (line.startsWith("[ti:")) { // 歌詞標題 lrc.setTitle(line.substring(4, line.length() - 1)); } else if (line.startsWith("[ve:")) { // 程式的版本 lrc.setVe(line.substring(4, line.length() - 1)); } if (line.startsWith("[ver:")) { // 程式的版本 lrc.setVe(line.substring(5, line.length() - 1)); } else { int delimiterIndex = line.indexOf("]"); String time = line.substring(1, delimiterIndex); String lrcContent = line.substring(delimiterIndex + 1); lrc.getLyric().put(time, lrcContent); } } return lrc; } public static void main(String[] args) throws IOException { List<String> lineList = FileUtils.readLines(new File("H:/KwDownload/Lyric/陳鴻宇-理想三旬.lrc"), "GBK"); Lrc lrc = parse(lineList); System.out.println(toJSONString(lrc, SerializerFeature.PrettyFormat)); } }
相關資料:
1. LRC格式 - 維基百科
.