2012-10-12 107 views
6

如何正確/向前和向後移動字幕時間?字幕時間格式如下: 00:00:52,656 --> 00:00:56,326如何更正/移動SRT(SubRip)文件中的字幕時間?

如果字幕和音頻不同步,例如,字幕前,語音/音頻顯示出來,然後字幕行所有時間(時間格式: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. 
+4

你遇到了哪些麻煩?這是真的特定於字幕,還是真的關於*任何*時間數字表示?什麼,具體來說,你想「轉移」? 「轉移」時間意味着什麼?在改變時間後,您的預期產出是多少? –

+0

如果我的問題不清楚,我很抱歉。這是編輯,我認爲現在更清晰。 –

+2

很好。謝謝。但是,你又遇到了哪些麻煩?你似乎已經明白了這個問題。 –

回答

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; 

enter image description here

編輯:

由於您的編輯,現在輸入可能包含「錯誤」行需要任何轉換了。

相關問題