2015年11月10日 星期二

字幕檔(.srt)時間軸平移

最近手上有一部電影,而網路上能找到的字幕檔又無法準確地跟電影時間軸對得上,而字幕格式為:

 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 指令。

沒有留言: