/** * 调整整体的时间,比如歌词统一快多少 或者歌词统一慢多少,为正说明要快,为负说明要慢 * * @param time * 要调的时间,单位是毫秒 */ public void adjustTime(int time) { // 如果是只有一个显示的,那就说明没有什么效对的意义了,直接返回 if (list.size() == 1) { return; } offset += time; info.setOffset(offset); }
/** * 把如00:00.00这样的字符串转化成 毫秒数的时间,比如 01:10.34就是一分钟加上10秒再加上340毫秒 也就是返回70340毫秒 * * @param time * 字符串的时间 * @return 此时间表示的毫秒 */ private long parseTime(String time) { String[] ss = time.split("\\:|\\."); // 如果 是两位以后,就非法了 if (ss.length < 2) { return -1; } else if (ss.length == 2) {// 如果正好两位,就算分秒 try { // 先看有没有一个是记录了整体偏移量的 if (offset == 0 && ss[0].equalsIgnoreCase("offset")) { offset = Integer.parseInt(ss[1]); info.setOffset(offset); System.err.println("整体的偏移量:" + offset); return -1; } int min = Integer.parseInt(ss[0]); int sec = Integer.parseInt(ss[1]); if (min < 0 || sec < 0 || sec >= 60) { throw new RuntimeException("数字不合法!"); } // System.out.println("time" + (min * 60 + sec) * 1000L); return (min * 60 + sec) * 1000L; } catch (Exception exe) { return -1; } } else if (ss.length == 3) {// 如果正好三位,就算分秒,十毫秒 try { int min = Integer.parseInt(ss[0]); int sec = Integer.parseInt(ss[1]); int mm = Integer.parseInt(ss[2]); if (min < 0 || sec < 0 || sec >= 60 || mm < 0 || mm > 99) { throw new RuntimeException("数字不合法!"); } // System.out.println("time" + (min * 60 + sec) * 1000L + mm * // 10); return (min * 60 + sec) * 1000L + mm * 10; } catch (Exception exe) { return -1; } } else {// 否则也非法 return -1; } }
/** * 分析这一行的内容,根据这内容 以及标签的数量生成若干个Sentence对象 当此行中的时间标签分布不在一起时,也要能分析出来 所以更改了一些实现 * 20080824更新 * * @param line * 这一行 */ private void parseLine(String line) { if (line.equals("")) { return; } Matcher matcher = pattern.matcher(line); List<String> temp = new ArrayList<String>(); int lastIndex = -1;// 最后一个时间标签的下标 int lastLength = -1;// 最后一个时间标签的长度 while (matcher.find()) { String s = matcher.group(); int index = line.indexOf("[" + s + "]"); if (lastIndex != -1 && index - lastIndex > lastLength + 2) { // 如果大于上次的大小,则中间夹了别的内容在里面 // 这个时候就要分段了 String content = line.substring(lastIndex + lastLength + 2, index); for (String str : temp) { long t = parseTime(str); if (t != -1) { System.out.println("content = " + content); System.out.println("t = " + t); list.add(new Sentence(content, t)); } } temp.clear(); } temp.add(s); lastIndex = index; lastLength = s.length(); } // 如果列表为空,则表示本行没有分析出任何标签 if (temp.isEmpty()) { return; } try { int length = lastLength + 2 + lastIndex; String content = line.substring(length > line.length() ? line .length() : length); // if (Config.getConfig().isCutBlankChars()) { // content = content.trim(); // } // 当已经有了偏移量的时候,就不再分析了 if (content.equals("") && offset == 0) { for (String s : temp) { int of = parseOffset(s); if (of != Integer.MAX_VALUE) { offset = of; info.setOffset(offset); break;// 只分析一次 } } return; } for (String s : temp) { long t = parseTime(s); if (t != -1) { list.add(new Sentence(content, t)); System.out.println("content = " + content); System.out.println("t = " + t); } } } catch (Exception exe) { } }