Arhn - архитектура программирования

Как исправить/сдвинуть время субтитров в файлах SRT (SubRip)?

Как исправить/сдвинуть время субтитров вперед и назад? Формат времени субтитров выглядит так: 00:00:52,656 --> 00:00:56,326

Если субтитры и аудио не синхронизированы, например, субтитры появляются перед голосом/аудио, то все время строк субтитров (формат времени: 00:00:52,656 --> 00:00:56,326) должно быть исправлено.

Таким образом, если время всех строк субтитров должно быть изменено/сдвинуто на 2 сек. вперед, то на этот раз для строки субтитров: 00:00:52,656 --> 00:00:56,326 следует изменить на: 00:00:54,656 --> 00:00:58,326.

И это относится ко всем временам в файле субтитров, а не только к одной строке текста/один раз.


Пример того, как выглядит файл SubRip (.srt):

1
00:00:52,656 --> 00:00:56,326
Kanalska Zona: Panama

2
00:00:56,335 --> 00:00:59,755
Francuzi su pokušali da izgrade
kanal pre Amerikanaca.
12.10.2012

  • С какой частью задания у вас возникли проблемы? Это действительно характерно для субтитров или это действительно любое время, выраженное в числовом выражении? Что конкретно вы хотите изменить? Что значит сдвинуть время? Каков ваш ожидаемый результат при смещении времени? 12.10.2012
  • Извините, если мой вопрос не был ясен. Это отредактировано, и я думаю, что теперь это яснее. 13.10.2012
  • Хорошо. Спасибо. Но опять же, с какой частью у вас проблемы? Кажется, вы уже поняли проблему. 13.10.2012
  • @Warren, к вашему обновлению, вы видели, как выглядит формат файла * .sub? 14.10.2012
  • Большинство файлов *.sub и *.srt выглядят как пример, который я только что добавил в вопрос, но они могут иметь другой вид. 14.10.2012
  • @Srdjan, я бы сказал, что вы показали формат * .srt, который имеет довольно фиксированный формат. Формат файла *.sub выглядит иначе. Да, многие видеоплееры могут справиться с неправильным использованием расширения файла, поэтому то, что вы видите как файл *.srt, на самом деле может быть файлом *.sub с неправильным расширением. 14.10.2012
  • То, что широко известно как файл sub (подзаголовок MicroDVD), даже не использует метки времени, а использует номера кадров. 15.10.2012
  • Я с @SertacAkyuz. формат sub использует кадры и зависит от частоты кадров видео. например {0}{20}Hello!. OP явно хочет использовать формат SubRip (srt). 15.10.2012

Ответы:


1

При условии, что формат каждой строки в вашем вводе всегда 00:00:00,000 --> 00:00:00,000, тогда эта процедура преобразует время строки в TDateTime, добавляет или вычитает сдвиг и переписывает строку:

procedure ShiftSubtitleTimes(Lines: TStrings; Diff: TTime);
var
  FS: TFormatSettings;
  I: Integer;
  T1: TDateTime;
  T2: TDateTime;
begin
  // Ensure using the correct time separator
  FS.TimeSeparator := ':';
  // Parse each line separately
  for I := 0 to Lines.Count - 1 do
  begin
    // Convert the two time strings to time values
    if not TryStrToTime(Copy(Lines[I], 1, 8), T1, FS) then
      // But skip line in case of wrong format
      Continue;
    T1 := T1 + StrToInt(Copy(Lines[I], 10, 3)) / MSecsPerDay;
    T2 := StrToTime(Copy(Lines[I], 18, 8), FS);
    T2 := T2 + StrToInt(Copy(Lines[I], 27, 3)) / MSecsPerDay;
    // Add the shift
    T1 := T1 + Diff;
    T2 := T2 + Diff;
    // Rewrite the line
    Lines[I] := FormatDateTime('hh:nn:ss,zzz --> ', T1, FS) +
      FormatDateTime('hh:nn:ss,zzz', T2, FS);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStringList;
begin
  List := TStringList.Create;
  try
    List.LoadFromFile('Filename.dat');
    Memo1.Lines.Add('Input:');
    Memo1.Lines.AddStrings(List);
    Memo1.Lines.Add('');
    // Shift 3,5 seconds backwards:
    ShiftSubtitleTimes(List, -3.5 / SecsPerDay);  
    Memo1.Lines.Add('Output:');
    Memo1.Lines.AddStrings(List);
  finally
    List.Free;
  end;
end;

введите здесь описание изображения

Изменить:

Из-за вашего редактирования теперь ввод может содержать «неправильные» строки, которые также не нуждаются в преобразовании.

13.10.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..