#字幕 #ass #解析器 #子站-alpha

ass_parser

用于编辑、创建和保存 .ass 文件的解析器

4 个版本

新版本 0.1.4 2024 年 8 月 23 日
0.1.3 2024 年 8 月 23 日
0.1.2 2024 年 8 月 22 日
0.1.1 2024 年 8 月 21 日
0.1.0 2024 年 8 月 21 日

1 in #ass

Download history 237/week @ 2024-08-16

每月 237 次下载

MIT/Apache

60KB
915

Crate Badge Docs Badge Deps.rs Badge
Crates.io Total Downloads

AssParser

ass_parser 是一个用于解析 .ass(高级子站 alpha)文件的 crate。它是一种视频文件中创建和显示字幕的字幕文件。由于其复杂的文本格式化、定位和样式,它被广泛使用。高级子站 alpha 是 SubStation Alpha .ssa 文件的继承者。

安装

ass_parser 添加到您的 cargo.toml 作为依赖项

cargo add ass_parser

介绍

AssParser 基于易于阅读、编写和修改 .ass 文件的原则。这是 ass_parser 的第一个版本,目前仅具有修改 .ass 文件的功能。

示例

使用默认值创建一个简单的 Advanced SubStation Alpha (.ass) 文件!

use ass_parser::{self, AssFile, ScriptInfo, V4Format, Events, AssFileOptions};
use hex_color::HexColor;

fn main() {
    let mut ass_file = AssFile::new();
    let hexcolor = AssFileOptions::get_ass_color(HexColor::YELLOW);

    ass_file.components.script
        .set_script(ScriptInfo::default());

    ass_file.components.v4
        .set_v4(V4Format::default())
        .set_primarycolour(&hexcolor);

    ass_file.components.events
        .set_events(Events::default());

    AssFile::save_file(&ass_file, "new_subtitles.ass")

}

在这里,我们创建一个具有默认值的 .ass 文件,当你打开 .ass 文件时,你可以看到以下内容。

ScriptType: v4.00+
PlayResX: 384
PlayResY: 288
ScaledBorderAndShadow: yes
YCbCr Matrix: None


[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&H00ff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1


[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,Hello Friend

添加对话

use ass_parser::{self, AssFile, ScriptInfo, V4Format, Events, AssFileOptions, Dialogue};
use ass_parser::IndexNotFound;
use hex_color::HexColor;

fn main() -> Result<(), IndexNotFound>{
    let mut ass_file = AssFile::new();
    let hexcolor = AssFileOptions::get_ass_color(HexColor::YELLOW);

    let first_dialogue = Dialogue::default()
        .set_text("Hello There!")
        .set_start("0:00:00.10")
        .set_end("0:00:00.50");

    let second_dialogue = Dialogue::default()
        .set_text("Hello Friend!")
        .set_start("00:00.50")
        .set_end("00:00.58");

    let third_dialogue = Dialogue::default()
        .set_text("Hello World!!")
        .set_start("0:00:00.58")
        .set_end("0:00:01.01");

    let events = Events::new()
        .add_first_dialogue(first_dialogue)?
        .add_dialogue(second_dialogue)
        .add_dialogue(third_dialogue)
        .create();


    ass_file.components.script
        .set_script(ScriptInfo::default())
        .set_scripttype("FFMPEG");

    ass_file.components.v4
        .set_v4(V4Format::default())
        .set_primarycolour(&hexcolor);

    ass_file.components.events
        .set_events(events);

    AssFile::save_file(&ass_file, "new_subtitles.ass");

    Ok(())

}

这将生成一个类似于下面的 ASS 文件

ScriptType: FFMPEG
PlayResX: 384
PlayResY: 288
ScaledBorderAndShadow: yes
YCbCr Matrix: None


[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&H0ffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,1


[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.10,0:00:00.50,Default,,0,0,0,,Hello There!
Dialogue: 0,00:00.50,00:00.58,Default,,0,0,0,,Hello Friend!
Dialogue: 0,0:00:00.58,0:00:01.01,Default,,0,0,0,,Hello World!!

也可以这样创建事件

 let first_dialogue = Dialogue::default()
   .set_start("0:00:00.10")
   .set_end("0:00:00.50");
 
 let second_dialogue = Dialogue::default()
   .set_start("00:00.50")
   .set_end("00:00.58");
 
 let third_dialogue = Dialogue::default()
   .set_start("0:00:00.58")
   .set_end("0:00:01.01");
 
 let events = Events::new()
   .add_first_dialogue(first_dialogue)?
   .add_dialogue(second_dialogue)
   .add_dialogue(third_dialogue)
   .create();

你可以将这个字幕文件烧录到视频中,或者使用任何视频播放器选择与这个字幕文件一起的视频文件。

使用 FFmpeg 烧录带有字幕的视频。

首先,你必须在你的系统上下载并安装 FFmpeg 来尝试此操作。一旦下载,你可以使用以下命令将视频文件 video.avi 和生成的字幕文件 new_subtitles.ass 烧录到单个输出视频文件 output.avi

ffmpeg -i video.avi -vf "ass=new_subtitles.ass" output.avi

依赖项

~88KB