最近下的一个视频字幕是webVTT格式的,但是pc端没找到能支持这种格式的视频播放器,所以每次需要手动转换字幕格式,从 .vtt转换为 .srt 。 从github上找了一个,不过只能转换指定目录下的 .vtt文件,而无法递归处理子目录下的字幕文件,所以自己用golang重新写了一个命令行工具。
对比 VTT 与 SRT两种字幕格式:
需要处理的就两点:
1.字幕序号。vtt是从0开始,而srt是从1开始
2.字幕的时间格式。 vtt是00:02.640 ,而 srt是 00:00:02,640 。
具体代码如下:
github : https://github.com/ksharpdabu/WebVTTtoSRTConverter
package main import ( "bufio" "flag" "fmt" "io" "os" "path/filepath" "strconv" "strings" "time" ) func main() { var files []string rootDir := flag.String("rootDir", "", "the path of directory contains .vtt files") flag.Parse() if *rootDir == "" { fmt.Print(" Please input VTT directory path!") return } //Iterate the specify directory and find all .vtt files err := filepath.Walk(*rootDir, func(path string, info os.FileInfo, err error) error { if strings.Contains(path, ".vtt") { files = append(files, path) } return nil }) if err != nil { panic(err) } for _, file := range files { converterSubtitles(file) } } //converter the vtt subtitle to the srt subtitle func converterSubtitles(path string) { //获取文件所在的文件夹 dir, fileName := filepath.Split(path) srtFile := dir + strings.TrimSuffix(fileName, ".vtt") + ".srt" f, err := os.Create(srtFile) if err != nil { fmt.Println("err = ", err) return } defer f.Close() vttFile, err := os.Open(path) if err != nil { fmt.Println("err = ", err) return } defer vttFile.Close() r := bufio.NewReader(vttFile) lineNumber := 1 var lineStr string var isCaptionLine = false for { //read file by line buf, _, err := r.ReadLine() if err != nil { if err == io.EOF { break } } lineStr = string(buf) if isTimeLine(lineStr) { //字幕行号 f.WriteString(strconv.Itoa(lineNumber) + "\n") lineNumber++ timeStrArr := strings.Split(strings.TrimSuffix(lineStr, "\n"), " --> ") const ( vttFormatStr = "04:05.000" srtFormatStr = "00:04:05.000" ) time1, _ := time.Parse(vttFormatStr, timeStrArr[0]) timeSrt1 := strings.Replace(time1.Format(srtFormatStr), ".", ",", 1) time2, _ := time.Parse(vttFormatStr, timeStrArr[1]) timeSrt2 := strings.Replace(time2.Format(srtFormatStr), ".", ",", 1) lineStr = timeSrt1 + " --> " + timeSrt2 + "\n" f.WriteString(lineStr) //下一行就是字幕 isCaptionLine = true } else if isCaptionLine { f.WriteString(lineStr + "\n\n") isCaptionLine = false } } } /** 判断是否是时间行 */ func isTimeLine(line string) bool { return strings.Contains(line, "-->") }
Convert WebVTT subtitles to SubRip
Usage:
WebVTTtoSRTConverter.exe -rootDir "C:\workspace\workspace_go\WebVTTtoSRTConverter\subtitle"
Options:
-rootDir : The path of the directory contains .vtt files. The program will iterate this directory and its subdirectory.
Note: You can build other versions by yourself.
References: