2012-10-12 34 views
6

Come correggere/spostare il tempo dei sottotitoli avanti e indietro? formato ora sottotitolo appare così: 00:00:52,656 --> 00:00:56,326Come correggere/spostare il tempo dei sottotitoli nei file SRT (Sottorisci)?

Se sottotitoli e audio non sono sincronizzati, ad esempio, sottotitolo si presenta prima che la voce/audio, quindi tutti i tempi di linee di sottotitoli (formato tempo: 00:00:52,656 --> 00:00:56,326) devono essere corretti.

Quindi, se il tempo di tutte le linee di sottotitoli deve essere modificato/spostato per 2 sec. in avanti, quindi, questa volta per la riga dei sottotitoli: 00:00:52,656 --> 00:00:56,326 deve essere modificato in: 00:00:54,656 --> 00:00:58,326.

E questo si riferisce a tutte le volte nel file dei sottotitoli, non solo una riga di testo/una volta.


Esempio di come SubRip (.srt) File assomiglia:

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

In quale parte del compito hai riscontrato problemi? È davvero specifico per i sottotitoli, o si tratta davvero di * qualsiasi * ora espressa numericamente? Cosa, in particolare, vuoi "spostare"? Cosa significa "spostare" il tempo? Qual è il risultato atteso, spostando il tempo? –

+0

Mi dispiace se la mia domanda non è stata chiara. È stato modificato e penso che ora sia più chiaro. –

+2

Buono. Grazie. Ma ancora, con quale parte hai problemi? Sembra che tu abbia già capito il problema. –

risposta

7

a condizione che il formato di ogni riga l'input è sempre 00:00:00,000 --> 00:00:00,000, allora questa routine permette di convertire i tempi di stringa per TDateTime , aggiungere o sottrarre il turno, e riscrivere la riga:

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

Modifica:

Grazie alla vostra modifica, ora di ingresso possono contenere linee 'sbagliate' che non hanno bisogno di conversione troppo.