2012-06-24 2 views
3

У меня есть видео с субтитрами (и соответствующими метками времени) в базе данных MySQL. Иногда временная метка видео и субтитров синхронизируется, иногда это не так.удаление «ускорения» из файлов субтитров

Проблема заключается в том, что это не соответствует смещению в видео (то есть разница растет по всему видео, чтобы с помощью простого обновления не работает: "UPDATE subtitles SET Timestamp=Timestamp+$time WHERE title=$video";')

Как написать PHP скрипт для вычисления «ускорение» смещения, а затем обновить несколько сотен записей MySQL для этого видео?

+0

Какой тип поля Отметка, я, полагая, что это число секунд после начала видео? –

+0

временная метка подсчитывает секунды или микросекунды? –

+0

количество секунд с начала, в секундах. – Justin

ответ

1

Похоже, у вас есть группа строк в таблице субтитров со значениями отметки времени, которые необходимо настроить индивидуально. Это предположение, но это звучит, как вам нужно изменить значения 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 

Опять же, в этом примере есть некоторые догадки, но такая работа должна работать.

Мы еще веселились? Мы? Мы?

+0

Святое объяснение Бэтмен! Спасибо Олли! Как рассчитать $ factor? Например, если строка «Stackoverflow rocks» проходит через 62 секунды в видео, но файл субтитров говорит, что это происходит через 74 секунды, а затем «Ответный вопрос» происходит через 210 секунд, но файл субтитров говорит, что это происходит через 525 секунд, то как мне это понять? 12 секундная разница 62 секунды и 315 секунд разница 210 секунд (и есть 0 разницей в 0 секунд), как мне это понять? Is is '{[(315-210) - (74-62)]/(210-62)}'? – Justin

+0

Этот подход использования фактора замедления времени сделал предположение о том, что трек субтитров может быть синхронизирован с видеодорожкой, ускоряя его или замедляя определенный процент. Примеры, которые вы показываете: 74: 62 и 525: 210 (субтитры: видео) показывают, что постоянный фактор замедления времени не будет работать. Я думаю, что перед вами стоит кропотливая работа по определению фактического момента времени для каждого подзаголовка. –

+0

ладно, спасибо в любом случае Олли. Я ценю ваше время и силы – Justin

0

Немного поздно, но лучше, чем никогда :)

Вы можете использовать библиотеку.
Например, длина вашего видео составляет 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'); 

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

Смежные вопросы