您还没有登录。现在登录注册

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 代码
 
  1. import re  
  2. import os  
  3.   
  4. delay = 0 #延迟值  
  5.   
  6. #字符串与毫秒互换  
  7. def str2ms(instr):  
  8.     parts = instr.split(',')  
  9.     big = parts[0].split(':')  
  10.     ms = int(big[0]) * 3600000 + int(big[1]) * 60000 + int(big[2]) * 1000 + int(parts[1])  
  11.     return ms  
  12.   
  13. def fix(src,l):  
  14.     '''fix 1 to 001'''  
  15.     start = 0  
  16.     ret = ''  
  17.     srcstr = str(src)  
  18.     while start < (l - len(srcstr)):  
  19.         ret += '0'  
  20.         start += 1  
  21.     ret = ret + srcstr  
  22.     return ret  
  23.       
  24. def ms2str(ms):  
  25.     def part1(second):  
  26.         ret = []  
  27.         ret.append(fix(second/3600,2))  
  28.         second = second - int(ret[0]) * 3600  
  29.         ret.append(fix(second/60,2))  
  30.         ret.append(fix(second - int(ret[1]) * 60,2))  
  31.         return ret  
  32.     return ','.join([':'.join(part1(ms/1000)),fix(ms%1000,3)])  
  33.   
  34. # 检测是否时间轴的行  
  35. def istimeline(rawstr):  
  36.     pattern = '^([0-9]{2}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1}),([0-9]{3}).*$'  
  37.     return re.search(pattern,rawstr)  
  38.   
  39. #使用新的时间轴代替旧的  
  40. def replace(rawstr):  
  41.     times = rawstr.split('-->')  
  42.     newtimes = []  
  43.     for t in times:  
  44.         newtimes += [ms2str(str2ms(t.strip()) - delay)]  
  45.     return '%s --> %s%s' % tuple(newtimes + [os.linesep])  
  46.   
  47. def parse_file(f):  
  48.     ret = ''  
  49.     try:  
  50.         for line in f:  
  51.             if istimeline(line):  
  52.                 ret += replace(line)  
  53.             else:  
  54.                 ret += line  
  55.     finally:  
  56.         f.close()  
  57.     return ret  
  58.   
  59. if __name__ == '__main__':  
  60.     f = open('E:\\imcoming\\Star Wars 1.chs.srt','r')  
  61.     delay = 8500  
  62.     s = parse_file(f)  
  63.       
  64.     nf = open('E:\\imcoming\\Star Wars 1.chs2.srt','w')  
  65.     nf.write(s)  
  66.     nf.close()  

 

 

标签:python 

评论(0条)



(可不填)



 = 

站内搜索

作者简介

jeff

OK Computer!

mail
qq

订阅我

我看我听我读

都有谁评论鸟

Tags

python 音乐 朋友 工作 django java 旅游 生活 丽江 云南 编程 google 2008 中国 年假 摇滚 javascript ajax grails 部署 apache air 学习 卖唱 lucene 技术 体验 发呆 flex 灾害 乐队 plone 灾难 哀悼日 开源 jmesa jquery flash ext web 健康 全文搜索 电影 sql 感情 orm 诗歌 数据库 计划 开发 原创 更新 空间 休假 life 许巍 杭州 鼻炎 moin 真诚 人生 感悟 感性 信息 设计 需求 ria 遇窃 香格里拉 大理 管理 算法 cms nuexo zope 左小诅咒 汉诺塔 AMF prototpye 快速开发 actionscript beautifulSoup 递归 网络 opensource 结婚 捐赠 scrum 软件过程 demo wiki 西片 英伦 中间件 erlang 并发 函数式编程 中文分词 模板 分页 成功 pagerank hibernate 日志 MYMeditor 恐怖 惊变 mysql rss 文艺片 太阳 彩色 factcgi lighttpd editor 中文 个性化 秋天 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 接口 设计模式 地下 广州 dvd 互联网 json 事业 职业 读书 香港 澳门 忧郁 冬天 compass 图表

日志分类

友情连接

Power By