package com.jikexueyuan.readlrc.main;

 import com.jikexueyuan.readlrc.utils.Utils;

 import java.io.File;

 /**
* Created by Tall on 2015/8/7.
*/
public class Main {
public static void main(String[] args) { File lrcFile = new File("resource/庄心妍-时间会走.lrc"); Utils utils = new Utils(); if (lrcFile.exists()) {
utils.parseLRC(lrcFile);
} else {
System.out.println("LRC文件不存在");
}
}
}

Main

 package com.jikexueyuan.readlrc.lrc;

 /**
* Created by Gaojinhua on 2015/8/8.
*/
public class LRC {
private int timeKey;
private String currentLrc; public LRC(int timeKey, String currentLrc) {
this.currentLrc = currentLrc;
this.timeKey = timeKey;
} public String getLrc() {
return currentLrc;
} public void setLrc(String lrc) {
this.currentLrc = lrc;
} public int getTimeKey() {
return timeKey;
} public void setTime(int timeKey) {
this.timeKey = timeKey;
}
}

LRC

 package com.jikexueyuan.readlrc.utils;

 import com.jikexueyuan.readlrc.lrc.LRC;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*; /**
* Created by Gaojinhua on 2015/8/8.
*/
public class Utils {
public void parseLRC(File lrcFile) {
String line; int timeKey;
String currentLrc; final Map<Integer, LRC> lrcMap = new LinkedHashMap<Integer, LRC>(); try {
FileInputStream fileInputStream = new FileInputStream(lrcFile);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); while ((line = bufferedReader.readLine()) != null) {
timeKey = 60 * Integer.parseInt(line.substring(line.indexOf(":") - 2, line.indexOf(":")))
+ Integer.parseInt(line.substring(line.indexOf(":") + 1, line.indexOf(":") + 3));
currentLrc = line.substring(line.lastIndexOf("]") + 1) + " "; LRC lrc = new LRC(timeKey, currentLrc);
lrcMap.put(lrc.getTimeKey(), lrc);
} final Timer timer = new Timer();
final TimerTask timerTask = new TimerTask() {
@Override
public void run() {
int tempTime = 0;
for (LRC lrc : lrcMap.values()) {
try {
Thread.sleep(1000 * (lrc.getTimeKey() - tempTime));
tempTime = lrc.getTimeKey();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.printf("\r" + lrc.getLrc());
}
timer.cancel();
//this.cancel();
}
};
timer.schedule(timerTask, new Date()); fileInputStream.close();
inputStreamReader.close();
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Utils

解析LRC歌词文件readlrc的更多相关文章

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

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

  2. c#解析Lrc歌词文件

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

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

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

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

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

  5. 浅析LRC歌词文件

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

  6. 10行代码解析krc歌词文件

    互联网上,我们常见的歌词格式有 LRC.TRC(天天动听歌词).KRC(KuGou ResourCe,酷狗资源文件)和 QRC(QQ音乐歌词):在影视制作中,人们通常会用其他的卡拉 OK 字幕格式,例 ...

  7. LRC歌词文件读取代码

    /**************************************************/ /*******************-main文件-******************* ...

  8. C#下载歌词文件

    前段时间写了一篇c#解析Lrc歌词文件,对lrc文件进行解析,支持多个时间段合并.本文借下载歌词文件来探讨一下同步和异步方法. Lrc文件在网络上随处可见,我们可以通过一些方法获取,最简单的就是别人的 ...

  9. lrc歌词文件格式

    一.lrc文件有什么作用 lrc文件就是一个文本文件,用来记录歌曲的歌词信息,使得播放歌曲时能够让歌词与声音同步显示,类似于电影字幕那种效果. 心情很丧时我们会听首歌陶冶一下情操,不知你是否注意过音乐 ...

随机推荐

  1. TestDriven.NET – 快速入门

    TestDriven.NET – 快速入门[译文] 介绍 这部分将提供一个快速的入门向导,在vs.NET的任何一个版本上面使用TestDriven.NET TDD(测试驱动开发)在你写你的代码之前,写 ...

  2. python视频教程大全

    python3英文视频教程(全87集) http://pan.baidu.com/s/1dDnGBvV python从入门到精通视频(全60集)链接:http://pan.baidu.com/s/1e ...

  3. 一个序列是否可能是push序列的pop序列

    输入:两个序列A.B,A作栈的push序列,判断B是否可能是A的pop序列. #include<iostream> #include<stack> using namespac ...

  4. C#多线程开发

    1.进程与线程的区别 通俗的讲,进行就是任务管理器中进行列表中看到的正在运行的程序,它是一个动态的概念,活动的实体. 线程是程序执行流的最小单元,是线程中一个实体,是系统独立调度和分派CPU基本单位. ...

  5. Spring强制使用CGLIB代理事务

    Spring强制使用CGLIB代理事务   springaopjdkreferenceclasspath Spring1.2: 将事务代理工厂[TransactionProxyFactoryBean] ...

  6. Codeforces Gym 100650D Queens, Knights and Pawns 暴力

    Problem D: Queens, Knights and PawnsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu ...

  7. MediaPlayer开发全解析

    本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...

  8. 贪心算法(2)-Kruskal最小生成树

    什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...

  9. iframe自适应高度的多种方法方法小结

    对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的  不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 ifram ...

  10. l​i​n​u​x添加​修​改​用​户​名​密​码

    语 法: useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组> ...