2012-10-12 510 views
6

¿Cómo corregir/desplazar el tiempo de los subtítulos hacia adelante y hacia atrás? formato de hora del subtítulo se ve así: 00:00:52,656 --> 00:00:56,326¿Cómo corregir/cambiar el tiempo de subtítulos en archivos SRT (SubRip)?

Si los subtítulos y el audio no están sincronizados, por ejemplo, muestra los subtítulos antes de voz/audio, entonces todo momento de las líneas de subtítulos (formato de tiempo: 00:00:52,656 --> 00:00:56,326) deben corregirse.

Por lo tanto, si el tiempo de todas las líneas de subtítulos debe cambiarse/cambiarse durante 2 segundos. hacia adelante, entonces, esta vez para la línea de subtítulos: 00:00:52,656 --> 00:00:56,326 debe cambiarse a: 00:00:54,656 --> 00:00:58,326.

Y esto se refiere a todas las veces en el archivo de subtítulos, no solo una línea de texto/una vez.


Ejemplo de cómo SubRip (.srt) archivo se ve así:

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

¿Con qué parte de la tarea está teniendo problemas? ¿Es esto realmente específico para los subtítulos, o se trata realmente de * cualquier * tiempo expresado numéricamente? ¿Qué, específicamente, quieres "cambiar"? ¿Qué significa "cambiar" el tiempo? ¿Cuál es tu salida esperada, al cambiar el tiempo? –

+0

Lo siento si mi pregunta no estaba clara. Está editado y creo que ahora está más claro. –

+2

Bueno. Gracias. Pero, de nuevo, ¿con qué parte estás teniendo problemas? Parece que ya entiendes el problema. –

Respuesta

7

siempre que el formato de cada línea en su entrada es siempre 00:00:00,000 --> 00:00:00,000, esta rutina convertirá los tiempos de cadena a TDateTime , sumar o restar el cambio, y volver a escribir la línea:

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

Editar:

Debido a su edición, ahora de entrada puede contener líneas 'erróneas' que no necesitan conversión también.

Cuestiones relacionadas