srt的時間軸格式例如以下:
1 00:00:36,800 --> 00:00:41,300 天下武功,皆出少林。
第一行是計數器。不用管。
第二行是時間軸,是我們的重點關注對象。這一行顯示小時,分,秒,毫秒。然后用一個箭頭隔開,表示從哪個時間到哪個時間顯示第三行的字幕。
java.time.Duration表示一段時間。對於srt字幕來說,00:00:36,800就表示從0開始到36秒800毫秒這段時間,所以邏輯上正好相應一個Duration。
以下這段代碼處理srt文件的一行。假設是時間軸行,則調整,否則原樣打印到新文件中。
void processLine(String line, int milliSecs) { if(line.indexOf("-->") != -1) { // 這一行是時間軸 // 將字幕顯示的起始時間和結束時間分開。String timespan[] = line.split("-->"); // 起始時間的小時、分、秒、毫秒分開。 String begin[] = timespan[0].split("[:,]"); // 重點:把起始時間的小時、分、秒、毫秒統統加在一起構造一個Duration。 // plus方法是可串行的,就像StringBuffer的append。
Duration beginTime = Duration.ofHours(Long.parseLong(begin[0].trim())).plus( Duration.ofMinutes(Long.parseLong(begin[1].trim()))).plus( Duration.ofSeconds(Long.parseLong(begin[2].trim()))).plus( Duration.ofMillis(Long.parseLong(begin[3].trim()))); // 結束時間也如法炮制。 String end[] = timespan[1].split("[:,]"); Duration endTime = Duration.ofHours(Long.parseLong(end[0].trim())).plus( Duration.ofMinutes(Long.parseLong(end[1].trim()))).plus( Duration.ofSeconds(Long.parseLong(end[2].trim()))).plus( Duration.ofMillis(Long.parseLong(end[3].trim()))); // 把這兩個時間分別加上我們希望的偏移量,也就是向前(milliSecs為負)或者向后移動的毫秒數, // 得到兩個新的Duration Duration newStart = beginTime.plusMillis(milliSecs); Duration newEnd = endTime.plusMillis(milliSecs); // pw是一個PrintWriter,把調整后的一行時間軸寫入新的字幕文件。
pw.println(parse(newStart) + " --> " + parse(newEnd)); } else { pw.println(line); // 不是時間軸行,原樣打印 } }
以下這一段代碼用來將一個Duration轉成00:00:36,800這樣的格式的字符串。
String parse(Duration d) { long h = d.toHours(); // 得到小時數 String sh = h<10 ? "0" + h : "" + h; // 假設僅僅有一位數。加上個0 // 為了得到后面的分,秒,毫秒,我們要將小時減掉,否則取分鍾的時候會連小時算進去 d = d.minusHours(h); long min = d.toMinutes(); // 得到分鍾 String smin = min<10 ? "0" + min : "" + min; d = d.minusMinutes(min); // 減掉分鍾 long s = d.getSeconds(); // 得到秒,注意這里是getSeconds,沒有toSeconds方法 String ss = s<10 ?"0" + s : "" + s; d = d.minusSeconds(s); // 減掉秒 long m = d.toMillis(); // 得到毫秒 String sm = m<10 ? "00" + m : (m<100 ? "0" + m : "" + m); return sh + ":" + smin + ":" + ss + "," + sm; }
此工具完整代碼可在此處下載:
http://download.csdn.net/detail/ioriogami/7626991