看电影看美剧字幕时间轴对不齐?不如用go语言自己写个工具对齐字幕

854 阅读4分钟

周末在家看美剧或者电影的时候,经常碰到 字幕文件的字幕时间轴和实际电影对不上,要么就晚 要么就早,尤其是mac下很多视频软件的 字幕延迟功能跟脑瘫一样,很不好用。

想来想去还不如自己写一个算了,其实也很简单, srt文件格式的字幕 如下:

1
00:01:53,340 --> 00:01:57,840
{\pos(99,242)}人人影视
原创翻译  双语字幕

2
00:01:53,840 --> 00:01:57,840
{\pos(235,237)}字幕组招新中
请访问 YYSubs.com

3
00:01:59,350 --> 00:02:04,390
{\an4}{\pos(35,220)}翻译    DerbyNinja  纸鹤  Amy  三四月  凉粉

4
00:02:04,390 --> 00:02:09,390
{\an4}{\pos(35,220)}翻译    存在主义灯泡  Piglet  Freddie爱咳嗽  Tokilltime  

5
00:02:09,390 --> 00:02:14,390
{\an4}{\pos(35,220)}翻译    Flevance  Sherlockkkkk  陈奥奥  Whosrona

6
00:02:14,390 --> 00:02:19,390
{\an4}{\pos(27,220)}时间轴    无关风粤  噃噃bobo   今  壬虚浪影

7
00:02:19,390 --> 00:02:24,390
{\an4}{\pos(35,220)}校对    小酸奶         后期    吉吉

8
00:02:24,390 --> 00:02:29,390
{\an4}{\pos(35,220)}总监    小酸奶

9
00:01:30,860 --> 00:01:34,780
{\an8}静水城

10
00:02:13,450 --> 00:02:18,800
{\an2}-我们把镇子清理干净后会怎么样
-他们会重建小镇

11
00:02:19,300 --> 00:02:22,540
{\an2}那居民会回来吗

12
00:02:23,090 --> 00:02:26,500
{\an2}大部分会  难以置信吧

13
00:02:26,920 --> 00:02:29,990
{\an2}我觉得美国人不喜欢改变

14
00:02:30,550 --> 00:02:35,090
{\an2}我觉得龙卷风才不管美国人喜欢什么


1964
02:12:23,890 --> 02:12:26,110
我几乎不认识这儿了
I don't hardly recognize it anymore.

要让字幕对齐 其实就是把这些时间轴的时间改一下,统一加多少秒或者减多少秒就行了

例如: image.png

我们就是把这个字幕的时间轴 统一提前了20s,你要提前就是负数。 要延后就正数

代码非常简单 其实就是读写文件 改一下时间而已,我这里用go写

package main

import (
   "flag"
   "io/ioutil"
   "os"
   "strconv"
   "strings"
   "unsafe"
)

func main() {
   var sourceFile string
   var desFile string
   var delaySec int64

   flag.StringVar(&sourceFile, "sourceFile", "", "字幕源文件地址 必填")
   flag.StringVar(&desFile, "desFile", "new.srt", "修改后的文件地址 可不填 不填就是当前目录的new.srt")
   flag.Int64Var(&delaySec, "sec", 0, "延迟的时间单位(秒) 可以为负数")
   flag.Parse()
   bytes, _ := ioutil.ReadFile(sourceFile)

   sourceString := BytesToString(bytes)
   sliceStr := strings.Split(sourceString, "\n")
   for i, v := range sliceStr {
      if strings.Contains(v, "-->") {
         last := modifyTime(v, delaySec)
         sliceStr[i] = last
      }
   }
   var lastStr string
   // 组成字符串
   for _, v := range sliceStr {
      lastStr = lastStr + v + "\n"
   }
   os.WriteFile(desFile,[]byte(lastStr),0644)

   //print(sourceString)

}

func modifyTime(s string, delay int64) string {
   timeSlice := strings.Split(s, " --> ")
   for i, v := range timeSlice {
      time, append := getTime(v)
      time = time + delay
      lastTime := toTime(time)
      lastV := lastTime + "," + append
      timeSlice[i] = lastV
   }
   return timeSlice[0] + " --> " + timeSlice[1]

}

//  输入 113 输出 00:01:53
func toTime(sec int64) string {
   hour := sec / 3600
   minute := (sec % 3600) / 60
   se := sec - 3600*hour - minute*60

   hours := strconv.Itoa(int64toInt(hour))
   mins := strconv.Itoa(int64toInt(minute))
   secs := strconv.Itoa(int64toInt(se))
   if len(hours) == 1 {
      hours = "0" + hours
   }
   if len(mins) == 1 {
      mins = "0" + mins
   }
   if len(secs) == 1 {
      secs = "0" + secs
   }
   return hours + ":" + mins + ":" + secs
}

func int64toInt(i int64) int {
   return *(*int)(unsafe.Pointer(&i))
}

//00:01:53,340  输出 113,340
func getTime(s string) (int64, string) {
   timeSlice := strings.Split(s, ",")
   time := timeSlice[0]
   timeS := strings.Split(time, ":")
   sec, _ := strconv.ParseInt(timeS[2], 10, 64)
   sec2, _ := strconv.ParseInt(timeS[1], 10, 64)
   sec3, _ := strconv.ParseInt(timeS[0], 10, 64)
   return sec + sec2*60 + sec3*3600, timeSlice[1]
}

func BytesToString(b []byte) string {
   return *(*string)(unsafe.Pointer(&b))
}

写完以后 就直接把mac和windows下的可执行文件都编译出来就可以直接使用咯

地址