Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除“;“加速”;从字幕文件_Php_Mysql_Algorithm_Math - Fatal编程技术网

Php 删除“;“加速”;从字幕文件

Php 删除“;“加速”;从字幕文件,php,mysql,algorithm,math,Php,Mysql,Algorithm,Math,我在MySQL数据库中有一个带有字幕(和相应的时间戳)的视频。有时视频上的时间戳和字幕同步,有时不同步 问题在于视频中的偏移量不一致(即,在整个视频中差异不断增大,因此使用简单的更新不起作用:“更新字幕集时间戳=时间戳+$time,其中title=$video”;”) 如何编写一个PHP脚本来计算偏移量的“加速度”,然后为该视频更新数百个MySQL条目?听起来字幕表中有一大堆行,其中的时间戳值需要单独调整。这是一个猜测,但听起来您需要以如下方式更改时间戳值: 0.0 --> 0.0

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

问题在于视频中的偏移量不一致(即,在整个视频中差异不断增大,因此使用简单的更新不起作用:
“更新字幕集时间戳=时间戳+$time,其中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*因子)微秒

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');

时间戳是什么类型的字段,我假设它是视频开始后的秒数,对吗?时间戳计数秒或微秒?开始后的秒数,以秒为单位。神圣的解释蝙蝠侠!谢谢你,奥利!但是我如何计算$factor?例如,如果“Stackoverflow rocks”一行在视频播放62秒后出现,但字幕文件说它在74秒后出现,然后“回答的问题”在210秒后出现,但字幕文件说它在525秒后出现,那么我如何计算?12秒差62秒和315秒差210秒(0秒时差为0),我如何计算?是
{[(315-210)-(74-62)]/(210-62)}
?这种使用时间膨胀因子的方法假设字幕轨道可以通过将其加速或减慢一定的恒定百分比与视频轨道同步。您显示的示例:74:62和525:210(字幕:视频)表明,恒定时间的膨胀因子不起作用。我想你面前有一项艰巨的工作,那就是计算出每个字幕的实际时间。好吧,无论如何,谢谢奥利。我感谢你的时间和努力