在.SRT文件中添加或减去秒数

4
我是一名助手,为您翻译以下内容:

我已经搜索过,并没有发现类似的结果。
我想要做的是创建一个简单的PHP/js/jq脚本,可以对.srt文件进行添加或减去秒数。我不确定是否应该使用正则表达式来实现它或者其他什么方法。
用户将上传/复制SRT文件的文本,然后在输入框中添加他们想要从SRT中添加或减去的秒数。

例如,如果用户将+4秒添加到以下srt文件中:

0
00:00:04,594 --> 00:00:10,594
this is a subtitle

1
00:00:40,640 --> 00:00:46,942
this is another subtitle

2
00:02:05,592 --> 00:02:08,694
this is one more subtitle

应该长这样:

0
00:00:08,594 --> 00:00:14,594
this is a subtitle

1
00:00:44,640 --> 00:00:50,942
this is another subtitle

2
00:02:09,592 --> 00:02:12,694
this is one more subtitle

你提出的问题听起来太笼统了。请缩小任务范围,并分享你已经尝试过的内容。 - Wiktor Stribiżew
1
读入数组,逐行循环提取时间,加上秒数并写入新文件 - 至少开始一个开端。 - user557846
维基百科关于.srt文件的条目似乎表明字幕编号出现在时间/字幕之前的那一行。只是想知道这是否是一个硬性要求,因为它可能会影响答案。 - Darragh Enright
我同意... 我不会使用正则表达式。有一个明确定义的简单格式...编写一个解析器来解析行。 - prodigitalson
2个回答

2
这是一个使用 PHP 的解决方案,它是你指定的语言之一。
如果您可以将要应用的时间偏移表示为字符串,则可以使用 DateTime 方法 DateTime::modify()DateTime::createFromFormat()preg_replace_callback() 来实现您想要做的事情。 SubRip Wikipedia entry 指定了时间码格式为:
小时:分钟:秒,毫秒
因此,我们可以编写一个正则表达式来捕获它;例如:/(\d+:\d+:\d+,\d+)/ - 尽管您可能希望对此进行改进。
假设您有一个 .srt 文件,已经读入了一个字符串变量 $srt,并且您希望将其所有时间增加 5 秒:
<?php

$srt = <<<EOL

0
00:00:04,594 --> 00:00:10,594 this is a subtitle

1
00:00:40,640 --> 00:00:46,942 this is a subtitle

2
00:02:05,592 --> 00:02:08,694 this is a subtitle
EOL;

$regex  = '/(\d+:\d+:\d+,\d+)/';
$offset = '+5 seconds';

$result = preg_replace_callback($regex, function($match) use ($offset) {
    $dt = DateTime::createFromFormat('H:i:s,u', $match[0]);
    $dt->modify($offset);
    return $dt->format('H:i:s,u');
}, $srt);

echo $result;

在每个$match上,使用DateTime::createFromFormat()将匹配的时间码转换为DateTime对象,然后可以修改和重新格式化为表示偏移时间的字符串。
您可以使用各种偏移值与DateTime::modify()一起使用,包括但不限于:+1 minute-30 seconds1 hour 2 minutes等。阅读链接的文档以获取更多详细信息。
这会产生以下结果:
0
00:00:09,594000 --> 00:00:15,594000 this is a subtitle

1
00:00:45,640000 --> 00:00:51,942000 this is a subtitle

2
00:02:10,592000 --> 00:02:13,694000 this is a subtitle

希望这有所帮助 :)

谢谢Darragh..!抱歉回复晚了,但我很感激。 这肯定会帮助我开始新的一天。 我测试过了,它运行得很好。谢谢,点赞是我能做的全部。 - Amit
没问题。很高兴能帮忙! - Darragh Enright
1
开箱即用。非常有帮助的解决方案! - Avatar

0
如果您想在您的网站上支持更多的格式,您可以使用库:
$user_subtitles = $_POST['user_subtitles'];

$subtitles = Subtitles::loadFromString($user_subtitles, 'srt'); // you can load different formats of subtitles
$subtitles->time(4); // +4 seconds

echo $subtitles->content();

https://github.com/mantas-done/subtitles


我尝试让你那个有前途的库工作,但是没有成功。我尝试了 require_once("Subtitles.php"),然后使用 use \Done\Subtitles\Subtitles; 并运行。结果:Fatal error: Uncaught Error: Class 'Done\Subtitles\Helpers' not found。然后我包含了 Helpers.php 和 Converter 文件夹中的 php 文件,接下来出现了错误:Interface 'Done\Subtitles\ConverterContract' not found - 你能完成上面的脚本吗? - Avatar
你需要使用“composer”进行加载。或者,可以像使用“required_once”一样加载所有文件。它们并不是很多。 - Mantas D

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