- 論壇徽章:
- 0
|
就是用昨天寫的模塊作為輔助,通過影片最后的一句話的時(shí)間位置和對(duì)應(yīng)的字幕位置,計(jì)算偏移比例。然后對(duì)每一個(gè)時(shí)間按這個(gè)比例因子修正。開始部分也許顯得快那么一點(diǎn)點(diǎn),不過整體效果很理想
![]()
:
[color="#808080"]# adjust-subtitles.py
[color="#808080"]# encoding:gb2312
[color="#808080"]# 開始基本一致.延遲時(shí)間逐漸增長
[color="#808080"]# 假設(shè)為線性增長.
[color="#808080"]# 時(shí)間偏移起始位置(基準(zhǔn)時(shí)刻)
[color="#808080"]# 取得采樣時(shí)間戳(采樣目標(biāo)時(shí)間40:20~采樣字幕時(shí)間41:55),采樣時(shí)間離基準(zhǔn)時(shí)間越長越精確
[color="#808080"]# 修正比例因子: (采樣x字幕時(shí)間-基準(zhǔn)時(shí)刻)/(采樣x目標(biāo)時(shí)間-基準(zhǔn)時(shí)刻) 取平均值
[color="#0000ff"]import [color="#000080"]re[color="#000000"],[color="#000080"]os[color="#000000"],[color="#000080"]sys
[color="#0000ff"]import [color="#000000"]timeItv
[color="#808080"]# 取得調(diào)整因子
[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"]# 對(duì)時(shí)刻的調(diào)整
[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"]# 輸入?yún)?shù)設(shè)定及格式檢查
[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"]# 計(jì)算偏差因子
[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"]
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/28253/showart_269226.html |
|