zoukankan      html  css  js  c++  java
  • 使用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


  • 相关阅读:
    关于VS下的应用程序出现0xc000007b的问题以及OpenCV相关的0xc000007b问题
    彻底解决DZ大附件上传问题
    基于Red5的视频直播平台
    .htaccess重写URL讲解
    了解Linux实时内核
    Linux操作系统实时性分析
    5分钟教程:如何通过UART获得root权限
    记一次有惊无险的Linux数据恢复过程
    11款最棒的Linux数据恢复工具
    Xamarin.Android开发实践(六)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6941609.html
Copyright © 2011-2022 走看看