从 .SRT 文件中增加或减少秒数
Posted
技术标签:
【中文标题】从 .SRT 文件中增加或减少秒数【英文标题】:Adding or substracting seconds from a .SRT file 【发布时间】:2015-12-03 11:10:43 【问题描述】:我已经搜索并没有发现类似的东西。 我想要实现的是创建一个简单的 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
【问题讨论】:
你提出这个问题的方式听起来太宽泛了。请缩小任务范围,并分享您迄今为止所做的尝试。 读入数组,逐行循环提取时间,加秒写入新文件——至少开始 Wikipedia's entry on .srt files 似乎暗示标题编号出现在时间/字幕之前的行上。只是想知道这是否是一个硬性要求,因为它可能会影响答案。 我同意...我不会正则表达式。有一个定义明确的简单格式……写一个解析行的解析器。 【参考方案1】:这里有一个 PHP 解决方案,它是您指定的语言之一。
如果您可以将要应用的时间偏移表示为string
,您可以使用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 seconds
、1 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
希望这会有所帮助:)
【讨论】:
谢谢达拉赫..!抱歉迟到了回复并确认。这肯定会帮助我开始我的一天。我测试了它,它工作正常。谢谢Upvote是我能做的。 没问题。很高兴为您提供帮助! 开箱即用。非常有用的解决方案!【参考方案2】:如果您想在您的网站上支持更多格式,您可以使用库:
$user_subtitles = $_POST['user_subtitles'];
$subtitles = Subtitles::load($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
。然后在 Converter 文件夹中包含 Helpers.php 和 php 文件,下一个错误:Interface 'Done\Subtitles\ConverterContract' not found
- 你能完成上面的脚本吗?
您好,您需要使用“composer”加载它。或者像使用 required_once 一样加载所有文件。数量不多。以上是关于从 .SRT 文件中增加或减少秒数的主要内容,如果未能解决你的问题,请参考以下文章