No puedo contar todas las veces que descargué una película ... legalmente, lo prometo ... y la película viene en un idioma que no entiendo, sin embargo la calidad es sin duda la mejor que no puedes buscar en Internet, por lo que simplemente decide conservar el archivo y buscar subtítulos en Internet. Desafortunadamente, los subtítulos no coinciden con las partes donde hablan los actores. Probablemente, ya utilizas un programa reproductor que incluye la función de retrasar el tiempo de los subtítulos, por ejemplo con Power DVD 17, puedes hacerlo fácilmente en la opción de subtítulos:
Nadie está descargando ninguna versión pirata del moview de John Wick aquí . Como puede ver, hay un área para retrasar los subtítulos en una cantidad específica de segundos. Eso es bastante útil, sin embargo, la configuración se almacenará en el reproductor, por lo que cuando mueva los archivos de la computadora, verá el problema con los subtítulos nuevamente.
La solución más rápida es utilizar una herramienta en línea como esta que ofrecen los chicos de Bits'n'Bites que te permite cargar un archivo SRT y sincronizar (cambiar) la hora de los subtítulos . Estas herramientas cambian todas las marcas de tiempo de un archivo de subtítulos de películas. Se puede utilizar para sincronizar los subtítulos de una película cuando hay un ligero desplazamiento entre los dos (este puede ser el caso cuando los subtítulos y la película provienen de dos fuentes diferentes) o cuando hay una diferencia de escala de tiempo (por ejemplo si la película y el archivo de subtítulos tienen diferentes velocidades de fotogramas).
Sin embargo, Our Code World no se trata de cómo resolver los problemas de los usuarios normales, ¿verdad? ¿Estás intentando implementar la misma herramienta del sitio web que te recomendamos anteriormente? Entonces, hoy es su día de suerte, ya que le explicaremos cómo hacerlo con un script Python de código abierto.
1. Creación de la secuencia de comandos de resincronización
Una implementación muy agradable en Python que puede encontrar para lograr esta tarea es el proyecto srt-resync disponible en Github aquí . Sin embargo, a menos que esté trabajando en un entorno basado en Linux, el script que encontró en el repositorio no funcionará correctamente en Windows debido a su forma de funcionalidad (funciona como un ejecutable bash), así que si intenta ejecutar el script con Python srt-resync {argumento} en un entorno como Windows, verá un error en el espacio de nombres principal. Para solucionar este problema le recomendamos que copie el contenido del script principal y cree su propio archivo de python como le explicaremos ahora.
Para comenzar, crea un archivo Python srt-resync.py
y almacene el siguiente código en el archivo:
"""
Copyright (c) 2013, William Ting
* This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
* This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original code: https://github.com/wting/srt-resync
Issue: the file in the repo doesn't contain any python format, so in
environments like Windows it can't run without modifying its extension
to srt-resync.py
"""
import argparse
import datetime
import os
import re
import shutil
import sys
from io import FileIO as file
VERSION = "0.1"
def parse_options():
global VERSION
parser = argparse.ArgumentParser(
description = 'Offset srt subtitles.')
parser.add_argument('offset', type = float)
parser.add_argument('srt_file', type = file)
parser.add_argument('-o', '--overwrite', action = "store_true", default = False,
help = "overwite original file")
parser.add_argument('--version', action = "version", version = "%(prog)s " + VERSION,
help = "show version information and quit")
return parser.parse_args()
def rzeropad(ms):
ms = str(int(ms))
while len(ms) < 3:
ms += "0"
return ms
def offset_time(offset, time_string):
#FIXME: no admite marcas de tiempo> = 24 horas
ts = time_string.replace(',', ':').split(':')
ts = [int(x) for x in ts]
ts = datetime.datetime(2013, 1, 1, ts[0], ts[1], ts[2], ts[3] * 1000) # millisecond -> microsecond
delta = datetime.timedelta(seconds = offset)
ts += delta
if ts.year != 2013 or ts.month != 1 or ts.day != 1:
sys.exit("ERROR: invalid offset resulting timestamp overflow")
return "%s,%s" % (ts.strftime("%H:%M:%S"), rzeropad(ts.microsecond / 1000)) # microsecond -> millisecond
def modify_file(options):
if '.srt' not in options.srt_file.name:
sys.exit("ERROR: invalid srt file")
out_filename = os.path.splitext(options.srt_file.name)[0] + '-resync.srt'
with open(out_filename, 'w', encoding = 'utf-8') as out:
with open(options.srt_file.name, 'r', encoding = 'utf-8') as srt:
for line in srt.readlines():
match = re.search(r'^(\d+:\d+:\d+,\d+)\s+--\>\s+(\d+:\d+:\d+,\d+)', line)
if match:
out.write("%s --> %s\n" % (
offset_time(options.offset, match.group(1)),
offset_time(options.offset, match.group(2))
))
else:
out.write(line)
if options.overwrite:
shutil.move(out_filename, options.srt_file.name)
if __name__ == "__main__":
modify_file(parse_options())
Esta secuencia de comandos cambia el tiempo de los subtítulos en un .srt
archivo por un desplazamiento determinado en segundos. Se admiten números negativos y segundos parciales. Guarde los cambios del archivo y proceda a aprender a usarlo en el siguiente paso.
Para obtener más información sobre este script, visite el repositorio oficial de Github aquí .
2. Usando el guión
Ahora que tiene el script de Python, simplemente puede ejecutarlo en su terminal proporcionando como primer argumento posicional el número de segundos que desea cambiar, por ejemplo, -0.50, +1, +1.50, etc. y como segundo argumento posicional, la ruta al archivo original de los subtítulos que desea corregir:
python srt-resync.py [+seconds or -seconds] [original_subtitles_file.srt]
De forma predeterminada, los scripts crean un nuevo archivo con el prefijo de resincronización al final del archivo; por ejemplo, si proporciona un archivo de entrada llamado subtitles.srt, el archivo de salida será subtitles-resync.srt. También puede sobrescribir el archivo original usando la opción -o o --overwrite.
El contenido del archivo srt original en nuestro caso es el siguiente:
1
00:03:36,055 --> 00:03:38,142
¿Ya cargaron todo?
2
00:03:38,183 --> 00:03:42,188
Casi.
3
00:03:42,687 --> 00:03:45,816
Con todo respeto,
¿es nuestra mejor opción?
4
00:03:45,857 --> 00:03:50,070
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...
5
00:03:50,862 --> 00:03:52,782
mató a un perro.
6
00:03:53,948 --> 00:03:55,743
Y robó un auto.
Luego la salida del archivo SRT con una modificación ( yourfile-resync.srt
) de -0.50
segundos con el siguiente comando:
REM mover los subtítulos menos medio segundo
python srt-resync.py -0.50 ./subtitles.srt
estarán:
1
00:03:35,555 --> 00:03:37,642
¿Ya cargaron todo?
2
00:03:37,683 --> 00:03:41,688
Casi.
3
00:03:42,187 --> 00:03:45,316
Con todo respeto,
¿es nuestra mejor opción?
4
00:03:45,357 --> 00:03:49,570
- ¿Por qué no corregimos el problema?
- Porque mi maldito sobrino...
5
00:03:50,362 --> 00:03:52,282
mató a un perro.
6
00:03:53,448 --> 00:03:55,243
Y robó un auto.
Bastante fácil, ¿verdad? Ahora tiene un archivo de subtítulos completamente funcional que coincide con la hora de su película descargada completamente legal ...
Que te diviertas ❤️!
Conviertete en un programador más sociable