使用Java8提供的Duration類制作字幕時間軸調整工具


網上下載的字幕有時和片源的時間軸不一致。我們能夠自己寫一個工具來調整,也就是總體向前移動幾秒,或者向后移動幾秒。Java8中提供的Duration類使得這樣的時間計算極其方便。以下就以最簡單的srt字幕格式為例說明。

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM