如何在Python 3中从SRT文件中重新同步电影的字幕(移位)

本文概述

  • 1.创建重新同步脚本
  • 2.使用脚本
我不能数所有的时间来下载电影… 合法地, 我保证… 电影以我不懂的语言来播放, 但是质量无疑是你无法做到的。在互联网上查找, 因此你只需决定保留文件并在互联网上搜索字幕。不幸的是, 字幕与演员说话的地方不匹配。可能你已经使用了包含该功能的播放器程序来延迟字幕的时间, 例如使用Power DVD 17, 你可以在字幕选项中轻松地做到这一点:
如何在Python 3中从SRT文件中重新同步电影的字幕(移位)

文章图片
没有人在这里下载任何John Wick moview的盗版版本。如你所见, 有一个区域可以在指定的秒数内延迟字幕。这非常有用, 但是配置将存储在播放器中, 因此, 当你移动计算机文件时, 你会再次看到字幕问题。
更快的解决方案是使用由Bits’ n’ Bites的家伙提供的在线工具, 使你可以上传SRT文件并同步(移动)字幕时间。这些工具可移动电影字幕文件的所有时间戳。当两者之间略有偏移时(当字幕和电影来自两个不同的来源时, 可能是这种情况), 它可用于将字幕与电影同步。如果电影和字幕文件的帧速率不同)。
但是, 我们的代码世界并不是关于如何解决普通用户的问题!!你是否要实施我们之前推荐的网站工具?那么今天就是你的幸运日, 因为我们将向你解释如何使用开源Python脚本来做到这一点。
1.创建重新同步脚本 你可以在Python中找到一个很好的实现该任务的实现, 该程序可在Github上找到srt-resync项目。但是, 除非你在基于Linux的环境中工作, 否则由于其功能方式(作为bash可执行文件), 你在存储库中找到的脚本将无法在Windows中正常工作, 因此, 如果你尝试使用python运行脚本srt-resync {argument}在Windows之类的环境中, 你将看到主命名空间的错误。为了解决这个问题, 我们建议你复制主脚本的内容并创建自己的python文件, 正如我们现在要解释的那样。
首先, 创建一个python文件srt-resync.py并将以下代码存储在该文件上:
"""Copyright (c) 2013, William Ting*This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See theGNU General Public License for more details.*You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.Original code: https://github.com/wting/srt-resyncIssue: the file in the repo doesn't contain any python format, so inenvironments like Windows it can't run without modifying its extensionto srt-resync.py"""import argparseimport datetimeimport osimport reimport shutilimport sysfrom io import FileIO as fileVERSION = "0.1"def parse_options():global VERSIONparser = 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 msdef offset_time(offset, time_string):#FIXME: does not support timestamps > = 24 hoursts = 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 -> microseconddelta = datetime.timedelta(seconds = offset)ts += deltaif 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 -> milliseconddef 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())

【如何在Python 3中从SRT文件中重新同步电影的字幕(移位)】该脚本以秒为单位将.srt文件中的字幕定时偏移给定的偏移量。支持负数和部分秒。保存文件的更改, 然后继续学习如何在下一步中使用它。
有关此脚本的更多信息, 请访问Github上的官方存储库。
2.使用脚本 有了python脚本后, 你只需在终端中运行该脚本, 即可将要移动的秒数作为第一个位置参数, 例如-0.50, + 1, + 1.50等, 并作为第二个位置参数, 即路径到你要修复的字幕的原始文件:
python srt-resync.py [+seconds or -seconds] [original_subtitles_file.srt]

默认情况下, 脚本创建一个新文件, 该文件的末尾带有resync前缀, 例如, 如果你提供一个输入文件subtitles.srt, 则输出文件将为subtitles-resync.srt。你也可以使用-o选项或– overwrite覆盖原始文件。
在我们的案例中, 原始srt文件的内容如下:
100:03:36, 055 --> 00:03:38, 142?Ya cargaron todo?200:03:38, 183 --> 00:03:42, 188Casi.300:03:42, 687 --> 00:03:45, 816Con todo respeto, ?es nuestra mejor opción?400:03:45, 857 --> 00:03:50, 070- ?Por qué no corregimos el problema?- Porque mi maldito sobrino...500:03:50, 862 --> 00:03:52, 782mató a un perro.600:03:53, 948 --> 00:03:55, 743Y robó un auto.

然后使用以下命令将SRT文件的输出(-yourfile-resync.srt)修改为-0.50秒:
REM move the subtitles by minus half secondpython srt-resync.py -0.50 ./subtitles.srt

将会:
100:03:35, 555 --> 00:03:37, 642?Ya cargaron todo?200:03:37, 683 --> 00:03:41, 688Casi.300:03:42, 187 --> 00:03:45, 316Con todo respeto, ?es nuestra mejor opción?400:03:45, 357 --> 00:03:49, 570- ?Por qué no corregimos el problema?- Porque mi maldito sobrino...500:03:50, 362 --> 00:03:52, 282mató a un perro.600:03:53, 448 --> 00:03:55, 243Y robó un auto.

很容易吧?现在, 你拥有了一个功能齐全的字幕文件, 该文件与你下载的合法电影的时间相匹配…
编码愉快!

    推荐阅读