Python应用:邪恶力量字幕线性增量偏移的修正
wibrst
|
1#
wibrst 发表于 2007-04-01 22:32
Python应用:邪恶力量字幕线性增量偏移的修正就是用昨天写的模块作为辅助,通过影片最后的一句话的时间位置和对应的字幕位置,计算偏移比例。然后对每一个时间按这个比例因子修正。开始部分也许显得快那么一点点,不过整体效果很理想 : [color="#808080"]# adjust-subtitles.py [color="#808080"]# encoding:gb2312 [color="#808080"]# 开始基本一致.延迟时间逐渐增长 [color="#808080"]# 假设为线性增长. [color="#808080"]# 时间偏移起始位置(基准时刻) [color="#808080"]# 取得采样时间戳(采样目标时间40:20~采样字幕时间41:55),采样时间离基准时间越长越精确 [color="#808080"]# 修正比例因子: (采样x字幕时间-基准时刻)/(采样x目标时间-基准时刻) 取平均值 [color="#0000ff"]import [color="#000080"]re[color="#000000"],[color="#000080"]os[color="#000000"],[color="#000080"]sys [color="#0000ff"]import [color="#000000"]timeItv [color="#808080"]# 取得调整因子 [color="#0000ff"]def [color="#000000"]getAdjustFactor ((t,s),b): [color="#000000"]mt[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]match(p,t) [color="#000000"]mr[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]match(p,s) [color="#0000ff"]if [color="#000000"]mt [color="#0000ff"]and [color="#000000"]mr: [color="#0000ff"]return [color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(s)[color="#008000"]-[color="#000000"]b)[color="#008000"]*[color="#000000"]1[color="#008000"].[color="#000000"]0[color="#008000"]/[color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(t)[color="#008000"]-[color="#000000"]b) [color="#0000ff"]else[color="#000000"]: [color="#0000ff"]print [color="#64a2e6"]"check the sample time format" [color="#000080"]sys[color="#008000"].exit[color="#000000"]() [color="#808080"]# 对时刻的调整 [color="#0000ff"]def [color="#000000"]adjustTime(_t,_b,_f): [color="#000000"]a[color="#008000"]=[color="#000000"]([color="#64a2e6"]"%2.3f" [color="#008000"]%[color="#000000"](_b[color="#008000"]+[color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(_t)[color="#008000"]-[color="#000000"]_b)[color="#008000"]/[color="#000000"]_f))[color="#008000"].[color="#000000"]split([color="#78ade9"]'.'[color="#000000"]) [color="#0000ff"]return [color="#000000"]timeItv[color="#008000"].[color="#000000"]itv2time([color="#808000"]int[color="#000000"](a[0]))[color="#008000"]+[color="#78ade9"]','[color="#008000"]+[color="#000000"]a[1] [color="#0000ff"]if [color="#008000"]__name__==[color="#64a2e6"]"__main__"[color="#000000"]: [color="#808080"]# 输入参数设定及格式检查 [color="#000000"]sBaseTime[color="#008000"]=[color="#64a2e6"]"00:00:00" [color="#000000"]aOffsetSample[color="#008000"]=[color="#000000"][([color="#64a2e6"]"00:40:19"[color="#000000"],[color="#64a2e6"]"00:41:55"[color="#000000"])] [color="#000000"]p[color="#008000"]=[color="#000000"]r[color="#64a2e6"]"^([0-9]+):([0-5][0-9]):([0-5][0-9])$" [color="#000000"]pc[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#808000"]compile[color="#000000"](p) [color="#0000ff"]if not [color="#000000"]pc[color="#008000"].[color="#000000"]match(sBaseTime): [color="#0000ff"]print [color="#64a2e6"]"sBaseTime should have format hh:mm:ss" [color="#000080"]sys[color="#008000"].exit[color="#000000"]() [color="#0000ff"]else[color="#000000"]: [color="#000000"]iBaseTime[color="#008000"]=[color="#000000"]timeItv[color="#008000"].[color="#000000"]time2itv(sBaseTime) [color="#808080"]# 计算偏差因子 [color="#000000"]iAdjustFactor[color="#008000"]=[color="#000000"]sum([color="#808000"]map[color="#000000"](getAdjustFactor,aOffsetSample,[iBaseTime][color="#008000"]*[color="#808000"]len[color="#000000"](aOffsetSample)))[color="#008000"]/[color="#808000"]len[color="#000000"](aOffsetSample) [color="#808080"]# 读入源字幕文件 [color="#000000"]fo[color="#008000"]=[color="#808000"]file[color="#000000"](r[color="#64a2e6"]"F:\字幕\邪恶力量\supernatural.103.hdtv-lol.chs.srt"[color="#000000"],[color="#64a2e6"]"r"[color="#000000"]) [color="#000000"]aContent[color="#008000"]=[color="#000000"]fo[color="#008000"].[color="#000000"]readlines() [color="#000000"]fo[color="#008000"].[color="#000000"]close() [color="#808080"]# 分行分析,处理字幕行,保留非字幕行 [color="#000000"]p[color="#008000"]=[color="#000000"]r[color="#78ade9"]'(\d\d:\d\d:\d\d),\d{3}( --> )(\d\d:\d\d:\d\d),\d{3}' [color="#000000"]pc[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#808000"]compile[color="#000000"](p) [color="#000000"]aContentTgt[color="#008000"]=[color="#000000"][] [color="#0000ff"]for [color="#000000"]ln [color="#0000ff"]in [color="#000000"]aContent: [color="#000000"]m[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]search(p,ln) [color="#0000ff"]if [color="#000000"]m: [color="#000000"]t1,middle,t2[color="#008000"]=[color="#000000"]m[color="#008000"].[color="#000000"]group(1,2,3) [color="#0000ff"]if [color="#000000"]t1[color="#008000"] |