我在 MySQL 数据库中有一个带有字幕(和相应的时间戳)的视频。有时视频和字幕上的时间戳会同步,有时则不会。
问题是它在视频中不是一致的偏移量(即差异在整个视频中都在增加,因此使用简单的 UPDATE 不起作用"UPDATE subtitles SET Timestamp=Timestamp+$time WHERE title=$video";'
:)
如何编写 PHP 脚本来计算偏移量的“加速度”,然后为该视频更新数百个 MySQL 条目?
听起来您在字幕表中有一堆行,其中包含需要单独调整的时间戳值。这是一个猜测,但听起来您需要以如下方式更改时间戳值:
0.0 --> 0.0
1.0 --> 1.1
2.0 --> 2.2
对于这个例子,公式是
newTimestamp[row n] = Timestamp[row 0] +
(Timestamp[row n] - Timestamp[row 0]) * factor)
本例中的系数为 1.1,这将使您的字幕速度提高 10%。
您的问题要求一种算法来确定要使用的正确因素。很抱歉,在不了解更多有关如何存储视频的信息的情况下,我无法建议一种方法来做到这一点。
然后,您要求一种算法将该因子应用于表行中的时间戳值。你所拥有的非常接近。像这样的东西应该工作:
UPDATE `subtitles`
SET `Timestamp`=
MIN(`Timestamp`) + ( $factor * (`Timestamp` - MIN(`Timestamp`) )
WHERE title=$video
问题是,DATETIME 值并不真正适用于算术。所以我们需要做更多的事情才能让它去。我们需要时间差作为一个数字,就像这样。
ROUND (
(( HOUR(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) * 3600.0) +
( MINUTE(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) * 60.0 ) +
( SECOND(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) )
) * 1000000.0 +
(MICROSECOND(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) )
)
这个毛茸茸的表达式将当前时间和第一次之间的差异转换为整数微秒。
然后我们需要应用这个因子并使用有效的时间算术将它添加回开始时间: timeval = othertimeval + INTERVAL ROUND(xx * factor) MICROSECOND
.
UPDATE `subtitles`
SET `Timestamp`=
MIN(`Timestamp`) + INTERVAL
ROUND ((
(( HOUR(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) * 3600.0) +
( MINUTE(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) * 60.0 ) +
( SECOND(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) )
) * 1000000.0 +
(MICROSECOND(TIMEDIFF(`Timestamp`,MIN(`Timestamp`))) )
) * $factor) MICROSECOND
WHERE title=$video
同样,这个例子中有一些猜测,但这种事情应该可行。
我们刚才玩的高兴吗?我们是吗?我们是吗?
有点晚了,但总比没有好:)
你可以使用图书馆。
例如,您的视频长度为 1 小时。并且您开头的字幕是同步的。并且在视频结尾的字幕是在视频前面 10 秒。所以你需要从最后减去-10秒。-5秒从中间......等等......
$subtitles = Subtitles::load('subtitles.srt'); // you can also manually add subtitles from DB using ->add(...) method
$subtitles->shiftTimeGradually(-10);
$subtitles->save('synced-subtitles.srt');