从字幕文件中删除“加速”

时间:2012-06-24 23:19:17

标签: php mysql algorithm math

我在MySQL数据库中有一个带字幕(和相应的时间戳)的视频。有时视频和字幕同步时间戳,有时它不会。

问题是它在视频中不是一致的偏移(即整个视频的差异在增加,因此使用简单的UPDATE不起作用:"UPDATE subtitles SET Timestamp=Timestamp+$time WHERE title=$video";'

如何编写PHP脚本来计算偏移量的“加速度”,然后为该视频更新数百个MySQL条目?

2 个答案:

答案 0 :(得分:1)

听起来你在字幕表中有一堆行,其中Timestamp值需要单独调整。这是猜测,但听起来你需要以这样的方式更改Timestamp值:

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 :(得分:0)

有点晚了,但它总比没有好:)

您可以使用图书馆 例如,您的视频长度为1小时。并且您开头的字幕是同步的。在视频结束时,视频前面的字幕是10秒。所以你需要从结尾减去-10秒。从中间开始-5秒...依此类推......

FirstRow = wsData.Range("C2").Row
LastRow = wsData.Range("C" & Rows.Count).End(xlUp).Row

For lrow = FirstRow To LastRow
    If wsData.Cells(lrow, 3).Value >= 0 And wsData.Cells(lrow + 1, 3).Value <= 0 Then
        For x = 1 To 5
        wsData.Rows(lrow + 1).Insert shift:=xlShiftDown
        Next x
    Exit For
    End If
Next lrow

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