MP3 lrc文件的解析

    今天在看Mars 的mp3播放器的视频时,看到lrc歌词文件的匹配, lrc文件的格式为

[00:01.00]第一次
[00:03.00]光良
[00:05.00]作词:张天成 作曲:光良 [00:08.00]当你看著我 我没有开口
[00:13.00]已被你猜透

[00:01.00]代表的是一个时间段, 可以表示为long time  =00*1000*60 +01*1000+00*100

后面的内容代表的是需要显示的内容, 我们在匹配歌词的时候 可以通过在 mp3文件play 时 获得begin=System.currentTimeMillis() ,

从而通过 当前时间-   System.currentTimeMillis()-begin>time 时 循环调用handle 来匹配歌词

 

因为下下来的歌词是

[02:14.00][00:42.00]不知不觉让视线开始闪烁
[03:09.00][02:23.00][00:51.00]喔 第一次我 说爱你的时候 

类型的,所以对歌词进行了下处理

	//传入该src文件路径,如果是网络读取的话,直接修改成inputStream
	//一般以第一次从网络读取后都会缓存到本地吧
	public static Map<Long,String> getStr(String url) {
		//此处定义为TreeMap 为了获得排列好的map
		Map<Long, String> map = new TreeMap<Long, String>();
		//匹配第一个[XXX]
		String str = "\\[[^\\]]+\\]";
		//匹配前面全部[XXX]
		String s = "\\[.+\\]";
		//定义时间
		long time = 0l;
		
		//定义内容
		String content = "";
		Pattern pattern = Pattern.compile(str);
		Pattern pat = Pattern.compile(s);
		try {
			//读取文本,我在本地访问正常,放到sdcard后变成为了乱码,改成了gbk正常
			//可能是模拟器原因吧
			FileInputStream in = new FileInputStream(url);
			BufferedReader br = new BufferedReader(new InputStreamReader(in,"gbk"));
			String line = null;
			while ((line = br.readLine()) != null) {
				//匹配第一个[XXX]
				Matcher m = pattern.matcher(line);
				while (m.find()) {
					Matcher mat = pat.matcher(line);
					// 通过长度判断 ,可以跳过前面的[[ti:第一次] 标题
					if (line.length() > m.group().length()&&mat.find()) {
						//System.out.println("find===="+mat.group());
						//歌词内容
					content = line.substring(mat.group().length());
					//从新获取第二个[XXX]到最后的对象
						line = line.substring(m.group().length());
						//[ti:第一次] 和[00:00.00]我也不知道该怎么处理好,暂且通过判断第二个是不是数字吧
						if ( mat.group().charAt(1) >= '0'
								&& mat.group().charAt(1) <='9') {
							//获取当前毫秒数
							time = parseTime(m.group().substring(1,
									m.group().length() - 1));
						}
					}
					//当不存在时间节点时,直接将节点加入到了Map
					else 
						content=m.group().substring(1,m.group().length()-1);
					if (map.containsKey(time)) {
						map.put(time, map.get(time) + ",\n" + content);
					} else
						map.put(time, content);
				}
			}
			System.out.println(map);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;

	}

	public static long parseTime(String str) {
		// System.out.println(str);
		long min = Long.parseLong(str.split("\\:")[0]);
		long sec = Long.parseLong((str.split("\\:")[1]).split("\\.")[0]);
		long mill = Long.parseLong(str.split("\\.")[1]);
		// System.out.println(min+"  "+sec+" "+mill);
		return min * 60 * 1000 + sec * 1000 + mill * 10;
	}


返回得到的map通过

  Queue<Long>  times=new LinkedList<Long>(map.keySet());
Queue<String>    contents=new LinkedList<String>(map.values());

 

转化为两个队列 然后通过  poll出栈就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值