6

字幕の時間を前後に修正/シフトする方法は? 字幕の時間形式は次のようになります。 00:00:52,656 --> 00:00:56,326

字幕とオーディオが同期していない場合、たとえば、字幕が音声/オーディオの前に表示される場合は、字幕行のすべての時間 (時間形式: 00:00:52,656 --> 00:00:56,326) を修正する必要があります。

したがって、すべての字幕行の時間を 2 秒間変更/シフトする必要がある場合。次に、今回は字幕 line:00:00:52,656 --> 00:00:56,326を に変更する必要があります 00:00:54,656 --> 00:00:58,326

これは、1 行のテキスト/1 回だけではなく、字幕ファイル内のすべての時間を指します。


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.
4

1 に答える 1

7

入力の各行の形式が常に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;

ここに画像の説明を入力

編集:

あなたの編集により、入力には変換を必要としない「間違った」行が含まれている可能性があります。

于 2012-10-13T08:54:09.990 に答える