golang多格式字幕文件处理插件库go-astisub的使用

Golang多格式字幕文件处理插件库go-astisub的使用

这是一个用于操作字幕的Golang库,支持处理多种字幕格式,包括srtstlttmlssa/asswebvttteletext

安装

安装库:

go get github.com/asticode/go-astisub

安装CLI工具:

go install github.com/asticode/go-astisub/astisub

在代码中使用库

警告:以下代码为了可读性没有处理错误,但在实际使用中你应该处理所有错误!

package main

import (
	"bytes"
	"time"
	
	"github.com/asticode/go-astisub"
)

func main() {
	// 打开字幕文件
	s1, _ := astisub.OpenFile("/path/to/example.ttml")
	s2, _ := astisub.ReadFromSRT(bytes.NewReader([]byte("1\n00:01:00.000 --> 00:02:00.000\nCredits")))

	// 为所有字幕添加持续时间(同步)
	s1.Add(-2*time.Second)

	// 分割字幕
	s1.Fragment(2*time.Second)

	// 合并字幕
	s1.Merge(s2)

	// 优化字幕
	s1.Optimize()

	// 取消分割字幕
	s1.Unfragment()

	// 应用线性校正
	s1.ApplyLinearCorrection(1*time.Second, 2*time.Second, 5*time.Second, 7*time.Second)

	// 写入字幕文件
	s1.Write("/path/to/example.srt")
	var buf = &bytes.Buffer{}
	s2.WriteToTTML(buf)
}

使用CLI工具

如果astisub已正确安装,你可以:

  • 将任何类型的字幕转换为其他类型:

    astisub convert -i example.srt -o example.ttml
    
  • 对任何类型的字幕应用线性校正:

    astisub apply-linear-correction -i example.srt -a1 1s -d1 2s -a2 5s -d2 7s -o example.out.srt
    
  • 分割任何类型的字幕:

    astisub fragment -i example.srt -f 2s -o example.out.srt
    
  • 将任何类型的字幕合并到其他类型的字幕中:

    astisub merge -i example.srt -i example.ttml -o example.out.srt
    
  • 优化任何类型的字幕:

    astisub optimize -i example.srt -o example.out.srt
    
  • 取消分割任何类型的字幕:

    astisub unfragment -i example.srt -o example.out.srt
    
  • 同步任何类型的字幕:

    astisub sync -i example.srt -s "-2s" -o example.out.srt
    

功能和路线图

  • [x] 解析
  • [x] 写入
  • [x] 同步
  • [x] 分割/取消分割
  • [x] 合并
  • [x] 排序
  • [x] 优化
  • [x] 线性校正
  • [x] .srt格式
  • [x] .ttml格式
  • [x] .vtt格式
  • [x] .stl格式
  • [x] .ssa/.ass格式
  • [x] .teletext格式
  • [ ] .smi格式

更多关于golang多格式字幕文件处理插件库go-astisub的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang多格式字幕文件处理插件库go-astisub的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-astisub处理多格式字幕文件

go-astisub是一个强大的Golang库,用于处理各种格式的字幕文件,包括SRT、SSA/ASS、TTML、WebVTT等。下面我将详细介绍如何使用这个库。

安装

首先安装go-astisub:

go get github.com/asticode/go-astisub

基本用法

1. 读取字幕文件

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/asticode/go-astisub"
)

func main() {
	// 读取SRT文件
	subs, err := astisub.OpenFile("example.srt")
	if err != nil {
		log.Fatal(err)
	}

	// 遍历所有字幕项
	for _, item := range subs.Items {
		fmt.Printf("From %s to %s: %s\n", 
			item.StartAt, 
			item.EndAt, 
			item.String())
	}
}

2. 创建新字幕文件

func createSubtitle() {
	// 创建新的字幕对象
	subs := astisub.NewSubtitles()

	// 添加字幕项
	subs.Items = append(subs.Items, &astisub.Item{
		StartAt: time.Second * 5,
		EndAt:   time.Second * 10,
		Lines: []astisub.Line{
			{Items: []astisub.LineItem{{Text: "第一行字幕"}}},
		},
	})

	subs.Items = append(subs.Items, &astisub.Item{
		StartAt: time.Second * 15,
		EndAt:   time.Second * 20,
		Lines: []astisub.Line{
			{Items: []astisub.LineItem{{Text: "第二行字幕"}}},
		},
	})

	// 写入SRT文件
	err := subs.Write("output.srt")
	if err != nil {
		log.Fatal(err)
	}
}

3. 格式转换

go-astisub可以轻松实现字幕格式转换:

func convertFormat() {
	// 读取SRT文件
	subs, err := astisub.OpenFile("input.srt")
	if err != nil {
		log.Fatal(err)
	}

	// 转换为WebVTT格式
	err = subs.Write("output.vtt")
	if err != nil {
		log.Fatal(err)
	}

	// 转换为TTML格式
	err = subs.Write("output.ttml")
	if err != nil {
		log.Fatal(err)
	}
}

高级功能

1. 调整时间偏移

func adjustTiming() {
	subs, err := astisub.OpenFile("example.srt")
	if err != nil {
		log.Fatal(err)
	}

	// 整体延迟2秒
	subs.Add(time.Second * 2)

	// 整体提前500毫秒
	subs.Add(-time.Millisecond * 500)

	err = subs.Write("adjusted.srt")
	if err != nil {
		log.Fatal(err)
	}
}

2. 合并字幕文件

func mergeSubtitles() {
	// 读取第一个字幕文件
	subs1, err := astisub.OpenFile("part1.srt")
	if err != nil {
		log.Fatal(err)
	}

	// 读取第二个字幕文件
	subs2, err := astisub.OpenFile("part2.srt")
	if err != nil {
		log.Fatal(err)
	}

	// 合并字幕
	merged := astisub.NewSubtitles()
	merged.Items = append(subs1.Items, subs2.Items...)

	// 写入合并后的文件
	err = merged.Write("merged.srt")
	if err != nil {
		log.Fatal(err)
	}
}

3. 处理样式和元数据

func handleMetadata() {
	subs, err := astisub.OpenFile("styled.ass")
	if err != nil {
		log.Fatal(err)
	}

	// 获取元数据
	fmt.Println("标题:", subs.Metadata.Title)
	fmt.Println("作者:", subs.Metadata.Author)

	// 修改样式
	for _, item := range subs.Items {
		for i := range item.Lines {
			item.Lines[i].Style = &astisub.Style{
				InlineStyle: &astisub.StyleAttributes{
					Color: "#FF0000", // 红色
				},
			}
		}
	}

	err = subs.Write("styled_output.ass")
	if err != nil {
		log.Fatal(err)
	}
}

支持的格式

go-astisub支持以下字幕格式:

  • SRT (SubRip)
  • SSA/ASS (SubStation Alpha)
  • TTML (Timed Text Markup Language)
  • WebVTT (Web Video Text Tracks)
  • STL (Spruce Subtitle File)
  • Teletext

性能考虑

对于大型字幕文件,建议使用流式处理:

func processLargeFile() {
	// 流式读取
	reader, err := astisub.NewReaderFromFile("large.srt")
	if err != nil {
		log.Fatal(err)
	}

	for {
		item, err := reader.ReadItem()
		if err != nil {
			if err == io.EOF {
				break
			}
			log.Fatal(err)
		}
		// 处理每个字幕项
		fmt.Println(item.String())
	}
}

go-astisub是一个功能全面且易于使用的字幕处理库,适合各种字幕处理需求,从简单的格式转换到复杂的时间轴调整和样式修改。

回到顶部