最近手上有一部電影,而網路上能找到的字幕檔又無法準確地跟電影時間軸對得上,而字幕格式為:
32 #序號行
00:03:16,785 --> 00:03:18,810 #開始時間 --> 結束時間
我是字幕 #字幕內容
目標就是要來平移時間軸,即把時間軸整個往前移動約莫一個小時左右。但是,實在懶得再去載軟體和想其他辦法來達成這件事情,於是花了點時間土法煉鋼地用 Python 寫了一個粗糙的 script ,我就稱之為 shift_time_srt.py 吧,原理就是把開始和結束的時間先統一轉換成秒,再統一加減想平移的時間(ex: 4079.100 sec),最後再存成「time_shift.srt」,以下為該程式碼內容:
import numpy as np
shift = 4079.100
text =''
f = open('time_shift.srt', 'w')
with open('original.srt') as g:
for line in g:
a=line.split()
if ('-->' in a) == False:
text = text + line
if ('-->' in a) == True:
b = [0, 2]
k = -1
text_part = ['','']
for i in b:
k = k + 1
Hr = a[i][0] + a[i][1]
Min = a[i][3] + a[i][4]
Sec = a[i][6] + a[i][7]
mSec = a[i][9] + a[i][10] + a[i][11]
Time = float(Hr)*3600.0 + float(Min)*60.0 + float(Sec) + \
float(mSec)*0.001
Time = Time - shift
if Time > 3600.000:
new_Hr = Time/3600.000
new_Hr = int(new_Hr)
Time = Time - 3600.000*new_Hr
new_Min = Time/60.000
new_Min = int(new_Min)
Time = Time - 60.000*new_Min
new_Sec = int(Time)
new_mSec = Time - new_Sec
new_mSec = round(new_mSec, 3) # round naturally to the third decimal place
new_Hr = '0' + str(new_Hr)
new_Min = str(new_Min)
new_Sec = str(new_Sec)
new_mSec = str(new_mSec)
if len(new_Min) == 1:
new_Min = '0' + str(new_Min)
if len(new_Min) == 2:
new_Min = str(new_Min)
if len(new_Sec) == 1:
new_Sec = '0' + str(new_Sec)
if len(new_Sec) == 2:
new_Sec = str(new_Sec)
if len(new_mSec) == 3:
new_mSec = new_mSec[2] + '0' + '0'
if len(new_mSec) == 4:
new_mSec = new_mSec[2] + new_mSec[3] + '0'
if len(new_mSec) == 5:
new_mSec = new_mSec[2] + new_mSec[3] + new_mSec[4]
elif Time < 3600.000 and Time > 60.000:
new_Hr = '00'
new_Min = Time/60.000
new_Min = int(new_Min)
Time = Time - 60.000*new_Min
new_Sec = int(Time)
new_mSec = Time - new_Sec
new_mSec = round(new_mSec, 3)
new_Hr = '0' + str(new_Hr)
new_Min = str(new_Min)
new_Sec = str(new_Sec)
new_mSec = str(new_mSec)
if len(new_Min) == 1:
new_Min = '0' + str(new_Min)
if len(new_Min) == 2:
new_Min = str(new_Min)
if len(new_Sec) == 1:
new_Sec = '0' + str(new_Sec)
if len(new_Sec) == 2:
new_Sec = str(new_Sec)
if len(new_mSec) == 3:
new_mSec = new_mSec[2] + '0' + '0'
if len(new_mSec) == 4:
new_mSec = new_mSec[2] + new_mSec[3] + '0'
if len(new_mSec) == 5:
new_mSec = new_mSec[2] + new_mSec[3] + new_mSec[4]
else:
new_Hr = '00'
new_Min = '00'
new_Sec = int(Time)
new_mSec = Time - new_Sec
new_mSec = round(new_mSec, 3)
new_Sec = str(new_Sec)
new_mSec = str(new_mSec)
if len(new_Sec) == 1:
new_Sec = '0' + str(new_Sec)
if len(new_Sec) == 2:
new_Sec = str(new_Sec)
if len(new_mSec) == 3:
new_mSec = new_mSec[2] + '0' + '0'
if len(new_mSec) == 4:
new_mSec = new_mSec[2] + new_mSec[3] + '0'
if len(new_mSec) == 5:
new_mSec = new_mSec[2] + new_mSec[3] + new_mSec[4]
text_part[k] = new_Hr + ':' + new_Min + ':' + new_Sec + ',' + new_mSec
text += text_part[0] + ' ' + '-->' + ' ' + text_part[1] + '\n'
f.write(text)
f.close()
ps: 在用上述 script 前,記得先把原來的字幕(original.srt)轉換為 UTF-8 編碼,轉換方式則可以使用 iconv 指令。
沒有留言:
張貼留言