DVDRip字幕偏移修正程序
分类:
编程
|
jeff 发表于:2007-12-09 20:50:43 |
0条评论 |
相信你也有过和我一样的经历:
花了九牛二虎的力气把星球大战的DVDRip下载回来,沿着Emule给的字幕连接去找,居然失败了,最后在射手网找回来的字幕都是不对板的,我的是3CD的版本,而字幕却是1CD版的。
或者,我找到了3CD的字幕,却发现该字幕与自己的版本还是有差别,字幕与声音延迟太让人难受了!
当互联网帮不上自己的时候,我知道,是时候靠自己了。于是,我用python写了一小段脚本,专门用来修正DVDRip字幕偏移。代码将贴在下面。使用方法也很简单,参考代码即可。主要是设置源字幕文件和输出文件以及一个延迟参数,延迟参数是指源字幕相对于实际情况延迟的毫秒数,如10秒则设置为10000,如果是超前了则设置为负数。
本程序只针对srt格式的字幕有效,后缀名有srt的文本格式字幕,你可以使用记事本打开来看。
srt格式的字幕是指这样的:
2
00:00:30,024 --> 00:00:35,018
很久以前 在遥远的银河系
最后,如何把1CD的版本分解成3CD呢?很简单,使用第1个CD修正后,截取余下的字幕另存一个,继续使用第二个CD修正。这个功能目前只能让安装有Python的朋友使用,目前我准备做成Web应用程序的版本,需要用的时候只需要上传一个字幕文件就OK。
python 代码
- import re
- import os
- delay = 0 #延迟值
- #字符串与毫秒互换
- def str2ms(instr):
- parts = instr.split(',')
- big = parts[0].split(':')
- ms = int(big[0]) * 3600000 + int(big[1]) * 60000 + int(big[2]) * 1000 + int(parts[1])
- return ms
- def fix(src,l):
- '''fix 1 to 001'''
- start = 0
- ret = ''
- srcstr = str(src)
- while start < (l - len(srcstr)):
- ret += '0'
- start += 1
- ret = ret + srcstr
- return ret
- def ms2str(ms):
- def part1(second):
- ret = []
- ret.append(fix(second/3600,2))
- second = second - int(ret[0]) * 3600
- ret.append(fix(second/60,2))
- ret.append(fix(second - int(ret[1]) * 60,2))
- return ret
- return ','.join([':'.join(part1(ms/1000)),fix(ms%1000,3)])
- # 检测是否时间轴的行
- def istimeline(rawstr):
- pattern = '^([0-9]{2}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1}),([0-9]{3}).*$'
- return re.search(pattern,rawstr)
- #使用新的时间轴代替旧的
- def replace(rawstr):
- times = rawstr.split('-->')
- newtimes = []
- for t in times:
- newtimes += [ms2str(str2ms(t.strip()) - delay)]
- return '%s --> %s%s' % tuple(newtimes + [os.linesep])
- def parse_file(f):
- ret = ''
- try:
- for line in f:
- if istimeline(line):
- ret += replace(line)
- else:
- ret += line
- finally:
- f.close()
- return ret
- if __name__ == '__main__':
- f = open('E:\\imcoming\\Star Wars 1.chs.srt','r')
- delay = 8500
- s = parse_file(f)
- nf = open('E:\\imcoming\\Star Wars 1.chs2.srt','w')
- nf.write(s)
- nf.close()
标签:python



评论(0条)