使用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;
}
此工具完整代码可在此处下载:
使用Java8提供的Duration类制作字幕时间轴调整工具的更多相关文章
- stout代码分析之一:Duration类
Duration类用于表示时间长度,可精确到纳秒. 代码实现在duration.hpp中,测试代码:duration_tests.cpp 相关api如下: parse, 将字符串转化成Duration ...
- Java8 Period 类与 Duration 类 用法详解
引言 Java 8 中引入了两个与日期相关的新类: Period :基于日期值 Duration:基于时间值 它们最大的作用就不需要你自己复杂的计算关于两个年月日之间的相差的时间或日期啦. Perio ...
- Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,
Java8 ,LocalDate,LocalDateTime处理日期和时间工具类 1.获取今天的日期 2.在Java 8 中获取年.月.日信息 3.在Java 8 中处理特定日期 4.在Java 8 ...
- Java基础进阶:时间类要点摘要,时间Date类实现格式化与解析源码实现详解,LocalDateTime时间类格式化与解析源码实现详解,Period,Duration获取时间间隔与源码实现,程序异常解析与处理方式
要点摘要 课堂笔记 日期相关 JDK7 日期类-Date 概述 表示一个时间点对象,这个时间点是以1970年1月1日为参考点; 作用 可以通过该类的对象,表示一个时间,并面向对象操作时间; 构造方法 ...
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法 获取Class类实例的方法: 类名.class 实例名.getClass() Class.forNam ...
- 巧用CSS3 :target 伪类制作Dropdown下拉菜单(无JS)
:target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如说当前页面URL下添加#comment就会定位到id=“comment”的位置,俗称锚).CSS3 为 ...
- 如何使用SubtitleWorkshop制作字幕
任意打开一段字幕文件 对于初学者而言还是最好打开一个带有中英字幕的视频文件(字幕是嵌入在视频文件里面的)然后一句一句照着写 先打开视频预览模式 再打开一段视频文件,并新建一个字幕文件 牢记几个快捷键 ...
- net 提供了Thread类用于线程的操作
net 提供了Thread类用于线程的操作. 当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程.后台线程将会随着主线程的推出而退出.后台线程不妨碍程序的 ...
- Java8 新特性 Optional 类
Optional 类的简介 Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常. Optional ...
随机推荐
- 解决IIS服务器部署 字体图标找不到的原因
引言 我们往往在IIS上部署Web项目,或者发布Web项目的时候,经常会遇到浏览器找不到字体文件(woff/woff2)产生的错误.这样会导致浏览器无法加载字体图标,在影响加载时间的同时,更无法显示对 ...
- 算法38---292. Nim游戏
1.题目: 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...
- iOS开发——GCD总结
Grand Central Dispatch,简称GCD,在异步执行任务的技术之一. 一般将应用程序中记述的线程管理用的代码在系统级中实现,开发者只需要定义想执行的任务并追加到适当的Dispatch ...
- (WC2018模拟十二)【FJOI2016集训Day7T1】挑选子序列
题解: 这题太神仙了,先咕着,放个令人****的官方题解(精确覆盖问题是NP完全问题啊摔) Dancing Link X学习资料:QAQ TAT qwq Orz Donald Knuth大神... p ...
- 【BZOJ3678】Wangxz和OJ
题意: 不想讲 题解: Rope真香! 正解是Splay缩点,访问时再拆成一个序列 代码: //STL dafa good! #include<algorithm> #include< ...
- 紫书 例题 10-2 UVa 12169 (暴力枚举)
就是暴力枚举a, b然后和题目给的数据比较就ok了. 刘汝佳这道题的讲解有点迷,书上讲有x1和a可以算出x2, 但是很明显x2 = (a * x1 +b) 没有b怎么算x2?然后我就思考了很久,最后去 ...
- 紫书 习题 11-2 UVa 1001 (Floyd)
这道题只是在边上做一些文章. 这道题起点终点可以看成半径为0的洞, 我是直接加入了洞的数组. 边就是两点间的距离减去半径, 如果结果小于0的话, 距离就为0, 距离不能为负 然后我看到n只有100, ...
- [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)
P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...
- 从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其它对象上同步与ThreadLocal. 前一章节我们使用了 1.synchronized在其它对象上同步 class ThreadA implements Runnable { ...
- 11g v$wait_chains 与 hanganalyze
11g之后,通过v$wait_chains视图诊断数据库hang和Contention 11g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后 ...