How to correct / shift subtitle time in SRT (SubRip) files?
Asked Answered
G

2

6

How to correct/shift subtitle time forward and backward? Subtitle time format looks like this: 00:00:52,656 --> 00:00:56,326

If subtitle and audio aren't synchronized, for example, subtitle shows up before voice/audio, then all times of subtitle lines (time format: 00:00:52,656 --> 00:00:56,326) should be corrected.

So, if time of all subtitle lines must be changed/shifted for 2 sec. forward, then, this time for subtitle line: 00:00:52,656 --> 00:00:56,326 should be changed to: 00:00:54,656 --> 00:00:58,326.

And this refers to all times in the subtitle file, not just one line of text/one time.


Example of how SubRip (.srt) file looks like:

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.
Gleich answered 12/10, 2012 at 17:15 Comment(8)
Which part of the task are you having trouble with? Is this really specific to subtitles, or is it really about any time expressed numerically? What, specifically, do you want to "shift"? What does it mean to "shift" the time? What is your expected output, upon shifting the time?Embattle
I'm sorry if my question was not clear. It's edited and I think that is clearer now.Gleich
Good. Thanks. But again, which part are you having trouble with? It seems like you already understand the problem.Embattle
@Warren, to your update, have you seen how the *.sub file format looks like ?Ionization
Most *.sub and *.srt files looks like example that I just add in question, but they can have different look.Gleich
@Srdjan, I'd say you've shown the *.srt format which has quite fixed format. The *.sub file format looks different. Yeah, many video players can handle the file extension misuse, so what you can see as a *.srt file might be in real a *.sub file with a wrong extension.Ionization
What is widely known as a sub file (MicroDVD subtitle) does not even use time stamps, it uses frame numbers.Slub
I'm with @SertacAkyuz. the sub format uses frames and depends on the frame rate of the video. e.g. {0}{20}Hello!. OP is clearly want to use the SubRip (srt) format.Agleam
A
8

Providing that the format of each line in your input is always 00:00:00,000 --> 00:00:00,000, then this routine will convert the string times to TDateTime, add or subtract the shift, and rewrite the line:

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;

enter image description here

Edit:

Due to your edit, now input may contain 'wrong' lines that need no conversion too.

Alessandraalessandria answered 13/10, 2012 at 8:54 Comment(0)
S
0

If you open your subtitle file with a free subtitle editor such as SubtitleEdit or Subtitle Workshop, you can easily adjust the times of all of your subtitles at once.

For SubtitleEdit you'll need to go to Synchronization > Adjust all times (Show earlier/later) > Adjust the amount of time you need to shift > Select if you want to apply it to all lines, only selected ones or from the selected onwards > Select either "Show earlier" or "Show later" > DONE!

Surgical answered 8/9, 2023 at 12:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.