周末在家看美剧或者电影的时候,经常碰到 字幕文件的字幕时间轴和实际电影对不上,要么就晚 要么就早,尤其是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.
要让字幕对齐 其实就是把这些时间轴的时间改一下,统一加多少秒或者减多少秒就行了
例如:
我们就是把这个字幕的时间轴 统一提前了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下的可执行文件都编译出来就可以直接使用咯