zoukankan      html  css  js  c++  java
  • lrc歌词文件格式

    一、lrc文件有什么作用

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

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

     image

    当前正在播放的这一句歌词会被高亮显示,从上面这幅图我们能够看出来,这个歌词文件至少记录了什么时间播放哪一句歌词,这些信息都是放在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格式 - 维基百科

    .

  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/cc11001100/p/9941715.html
Copyright © 2011-2022 走看看