Java API for SRT字幕

12

有没有 Java API 可以处理 SRT 字幕?

4个回答

7
实际的SRT解析是通过正则表达式完成的,Java可以操作它。
实际的正则表达式为:
protected static final String nl = "\\\n";
protected static final String sp = "[ \\t]*";
Pattern.compile("(?s)(\\d+)" + sp + nl + "(\\d{1,2}):(\\d\\d):(\\d\\d),(\\d\\d\\d)" + sp + "-->"+ sp + "(\\d\\d):(\\d\\d):(\\d\\d),(\\d\\d\\d)" + sp + "(X1:\\d.*?)??" + nl + "(.*?)" + nl + nl);

第2、3、4和5组是开始时间 第6、7、8和9组是结束时间 第11组是字幕文本


4
谢谢!你能否解释一下这个东西的含义:"(X1:\d.*?)??"?这是一个正则表达式,用于匹配字符串中的模式。它的意思是:查找以"X1:"开头并后跟任意数字字符的子字符串(非贪婪匹配),但该子字符串是可选的(即可以有也可以没有)。问号表示该组是可选的。 - kolobok
2
还有一个错误 - 用“\n”代替“\\n” 。最好将其替换为“\r?\n” (在Windows和Unix上均可工作),如此处所述 - kolobok
1
你在哪里看到了“\n”模式?关于\r字符,我想说你是对的,但由于某些原因我现在无法解释,即使文件中有\r字符,该模式也能成功匹配并产生正确结果! - Panayotis

6
我已经编写了一段Java逻辑,可以解析和读取不同的字幕格式,其中包括流行的srt格式: 你可以在我的GiT存储库中找到根据MIT开源许可证(可自由使用)授权的代码:https://github.com/JDaren/subtitleConverter。你可能只需要基本类和SRTFormat类,有了它们,你就可以从InputStream中读取srt文件或在编辑完文件后获得完整的String[]文件。
如果你觉得这个对你有用或者我可以帮你做些什么,请联系我。
PS:(其他支持的格式,部分或全部包括.ASS .SSA .STL .SCC 和 W3C的TTAF-DFXP(也称为TTML 1.0).XML)
编辑:
你可以在www.subtitleconverter.net上找到这个逻辑的应用。

需要改进。空类(例如Region)和捕获NullPointerException不太好。 - kolobok
@akapelko 区域是未来功能(这就是为什么它为空),用于其他格式(在屏幕上设置字幕),SRT不提供任何布局。NullPointerException可能会在奇怪的情况下出现,到目前为止,大多数已经被更正为首先检查null或使用大小为0的变量进行初始化。但你说得对,一些重构会很好... 但对于SRT来说,它非常有效。 - Daren
1
太棒了,非常好的东西:)))))) - Hendy Irawan

6

实际上,支持多行字幕文本的修改后的正则表达式来自@Panayotis,如下所示:

protected static final String nl = "\\n";
protected static final String sp = "[ \\t]*";
Pattern.compile(
                    "(\\d+)" + sp + nl
                    + "(\\d{1,2}):(\\d\\d):(\\d\\d),(\\d\\d\\d)" + sp
                    + "-->" + sp + "(\\d\\d):(\\d\\d):(\\d\\d),(\\d\\d\\d)" + sp
                    + "(X1:\\d.*?)??" + nl + "([^\\|]*?)" + nl + nl);

([^\\|]*?)替换为任何概率较小的字符,这些字符不太可能成为字幕文本。我目前使用的是“|”字符否定规则。


1
使用((.|\\n)*?)代替([^\\|]*?),这样就不会出现任何异常。 - Carson Ip

3

这里有另一个基础的(且开源的)API,可以处理SRT和ASS字幕,链接在这里

解析SRT:

File file = Paths.get("subtitle.srt").toFile();
SRTSub subtitle = new SRTParser().parse(file);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接