2012-10-12 88 views
6

Jak poprawić/przesunąć czas napisów do przodu i do tyłu? Napisy format czasu wygląda następująco: 00:00:52,656 --> 00:00:56,326Jak poprawić/przesunąć czas napisów w plikach SRT (SubRip)?

Jeśli napisy i dźwięk nie są zsynchronizowane, na przykład napisów pojawia się przed głosu/dźwięku, to wszystkie czasy napisów linii (format czasu: 00:00:52,656 --> 00:00:56,326) powinny być poprawione.

Tak więc, jeśli czas wszystkich linii napisów musi zostać zmieniony/przesunięty na 2 sekundy. naprzód, tym razem podtytuł: 00:00:52,656 --> 00:00:56,326 należy zmienić na: 00:00:54,656 --> 00:00:58,326.

Dotyczy to wszystkich czasów w pliku z napisami, a nie tylko jednego wiersza tekstu/jeden raz.


Przykład jak SubRip (.srt) plik wygląda następująco:

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

Z którą częścią zadania masz problemy? Czy to naprawdę dotyczy napisów, czy naprawdę chodzi o * dowolny * czas wyrażony numerycznie? Co konkretnie chcesz "przesunąć"? Co to znaczy "przesunąć" czas? Jaka jest twoja spodziewana wydajność, po przesunięciu czasu? –

+0

Przykro mi, jeśli moje pytanie nie było jasne. Jest edytowany i myślę, że teraz jest jaśniejszy. –

+2

Dobrze. Dzięki. Ale znowu, z którą częścią masz problemy? Wygląda na to, że już rozumiesz problem. –

Odpowiedz

7

Zapewnienie, że format każdej linii w swojej wejścia jest zawsze 00:00:00,000 --> 00:00:00,000, to ta procedura będzie przekonwertować ciąg do TDateTime razy , dodać lub odjąć przesunięcie i przepisać wiersz:

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:

Ze względu na edycję, teraz wejściowy może zawierać „złego” linie, które nie wymagają zbyt konwersji.