从 .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 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

希望这会有所帮助:)

【讨论】:

谢谢达拉赫..!抱歉迟到了回复并确认。这肯定会帮助我开始我的一天。我测试了它,它工作正常。谢谢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 文件中增加或减少秒数的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 增加或减少音频文件的音高

CNN 的自动编码器 - 减少或增加过滤器?

在 JavaScript 或 jQuery 中增加和减少数量时如何计算价格?

iPhone 音量间歇性/突然增加或减少

如何在 Common Lisp 中增加或减少数字?

如何在C中找到堆栈正在增加或减少?