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
