1. ass1.1 ssa-ass1.2 脚本说明1.2.1 头部1.2.2 样式定义1.2.3 主体1.2.4 注意事项1.3 双语字幕
2. srt2.1 文件格式2.2 样式2.3 位置
3. 小结3.1 列出支持的格式3.2 srt-ass3.3. sbv-srt
4 字幕操作4.1 软字幕(推荐)4.1.1 提取字幕流4.1.2 添加字幕流4.1.3 注意4.2. 硬字幕(不推荐)
5. 相关链接
1. ass
1.1 ssa-ass
https://en.wikipedia.org/wiki/SubStation_Alpha
https://zh.wikipedia.org/wiki/SubStation_Alpha
- SubStation Alpha(或 Sub Station Alpha),简称SSA,是由 CS Low(亦作 Kotus)创建、比传统字幕(如SRT)更加强大先进的字幕文件格式。该格式在Windows平台上可以经播放器由VSFilter渲染进行播放。这是一款广受欢迎且已停止开发的字幕编辑制作工具。
- 而Advanced SubStation Alpha(ASS)是一种比SSA更先进的字幕脚本格式。基于SSA 4.00+编码构建。ASS的主要变化就是在SSA编写风格的基础上增添更多的效果和指令。SSA当前版本为V4.00。ASS则使用更高级的V4.00+编码。
1.2 脚本说明
1.2.1 头部
Script Info: 脚本的一般全局信息:
Title:标题
Original Script:作者
Script Updated By:更新时间
Script Type:类型(用于兼容性设置,SSA为4.00,ASS为4.00+)
PlayResX & PlayResY:屏幕宽高
PlayDepth(决定颜色数量)
Timer:定时器
1.2.2 样式定义
V4 Styles: 定义文字样式,在events部分可以直接调用这些样式。
[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
[V4+ 样式]
格式:名称、字体名称、字体大小、原色、副色、轮廓色、底色、粗体、斜体、下划线、删除线、
缩放X、缩放Y、间距、角度、边框样式、外线、阴影、对齐、边距L、边距R、边距V、编码
PrimaryColour. 第一颜色,即文字本身的颜色
SecondaryColour. 第二颜色。在卡拉OK时使用,卡拉OK指令会用第一颜色填充第二颜色。
TertiaryColour(ASS中称为OutlineColour)边框色,文字边框的颜色。
BackColour. 阴影颜色,文字阴影的颜色。
MarginL, MarginR. 左右缩进。文字距离视频最左最右的最小距离。
MarginV. 上下缩进。文字热点(对齐点)距离视频上下的最小间距离。这取决于文字对齐方式,如果该文字使用中对齐,则上下缩进值无效。需要时文字可用\n或\N命令换行。ASS文件中,Script Info部分的一个参数“WrapStyle”也可以改变此值。
Outline. 边框样式,文字可以设定为有边框,无边框,或拥有不透明边框(矩形背景)。
Shadow. 阴影距离。文字的阴影到文字的距离大小。
AlphaLevel. 透明度(0至255有效)
Encoding. ASCII码中的文字编码方式。
1.2.3 主体
Events: 字幕的主体部分。
字幕的出现时间和样式、对样式的修改和特效均在这里编写。 其一般语法格式为:{\命令(参数,多个参数用逗号隔开)}, 例如 {\move(80,80,200,200,150,300)}.只有一个参数的命令不需要括号 (如. {\kf89}).
1.2.4 注意事项
一对大括号内可以放置多个语句。 如. {\bord8\be1}
换行的 \N 和 \n 命令不需要在两边加大括号就可使用。
1.3 双语字幕
[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,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
Style: Chs,Arial,12,&Hcccccc,&Hcccccc,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
Style: Eng,Arial,20,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:01:06.63,0:01:07.63,Default,,0,0,0,,GIRL: Hey, Nat!\N{\rChs}女孩:嘿,纳特!
Dialogue: 0,0:01:37.08,0:01:38.71,Default,,0,0,0,,We're both upside down.\N{\rChs}我们两个都颠倒了。
Dialogue: 0,0:01:38.87,0:01:40.96,Default,,0,0,0,,And I bet you're gonna fall down first.\N{\rChs}我打赌你会先倒下。
Dialogue: 0,0:01:41.12,0:01:42.66,Default,,0,0,0,,No, you will.\N{\rChs}不,你会的。
2. srt
https://zh.wikipedia.org/wiki/SubRip
https://en.wikipedia.org/wiki/SubRip
SubRip是一款适用于Microsoft Windows的免费软件程序,可将字幕及其时间从各种视频格式提取到文本文件中。它是在GNU GPL下发布的。其字幕格式的文件扩展名得到广泛支持。每个文件都是人类可读的文件格式,其中字幕与时序信息一起顺序存储。互联网上分发的大多数字幕都是这种格式。.srt
2.1 文件格式
序号开始: 标识顺序的数字计数器
时间起始: 字幕应该出现在屏幕上的时间 --> 它应该消失的时间
字幕内容: 一行或多行的字幕文本本身
空行结束: 一个不包含文本的空行,表示该标题的结束
2.2 样式
非正式地,该格式具有非常基本的文本格式,可以根据处理应用程序进行解释或传递以进行渲染。格式源自 HTML 标记的粗体、斜体、下划线和颜色:
粗体——<bold>…</bold>或{bold}…{/bold}
斜体 -<italic>…</italic>或{italic}…{/italic}
下划线 –<underline>…</underline>或{underline}…{/underline}
color 字体颜色 - <font color="color name or #code">…</font>(如在HTML 中)
position 行位置 -X1:… X2:… Y1:… Y2:…在时间戳之后表示文本坐标
2.3 位置
字幕摆放, 若不明示, 则处在底部居中位置, 即默认{\an2}. 可使用如下标识控制字幕出现的位置.
|\– 字幕靠左 字幕居中 字幕靠右
顶部 {\an7} {\an8} {\an9}
中间 {\an4} {\an5} {\an6}
底部 {\an1} {\an2} {\an3}
3. 小结
ass 相当于 srt + 简单样式表
- 只需要单纯文本字幕时使用 srt
- 需要样式文本字幕时使用 ass
常见的应用是中英双语字幕时, 使用ass可以很方便的分别控制2种语言的颜色, 字体大小.
3.1 列出支持的格式
$ ffmpeg -hide_banner -codecs | grep "^...S"
..S... = Subtitle codec
DES... ass ASS (Advanced SSA) subtitle (decoders: ssa ass ) (encoders: ssa ass )
..S... srt SubRip subtitle with embedded timing
..S... ssa SSA (SubStation Alpha) subtitle
DES... subrip SubRip subtitle (decoders: srt subrip ) (encoders: srt subrip )
DES... mov_text MOV text
...
3.2 srt-ass
https://trac.ffmpeg.org/wiki/HowToConvertSubtitleToASS
$ ffmpeg -i input.srt output.ass
$ ffmpeg -i out.ass out.srt
3.3 sbv-srt
https://trac.ffmpeg.org/wiki/HowToConvertYouTubeSBVtoSRT
ffmpeg -i captions.sbv captions.srt
ffmpeg -fix_sub_duration -i captions.sbv captions.srt
4. 字幕操作
4.1 软字幕(推荐)
软字幕是独立于视频流的字幕流信息, 可以加入多个, 删除也很方便, 视频不需要重新编码, 速度相当于复制文件.
4.1.1 提取字幕流
查看视频文件信息, 找到需要的字幕流
$ ffmpeg -i input.mkv
不指定map, 默认提取第一个字幕
$ ffmpeg -i input.mkv sub.srt
绝对map, 提取第6个流信息
$ ffmpeg -i input.mkv -map 0:5 sub.srt
相对map, 提取第4个字幕流信息
$ ffmpeg -i input.mkv -map 0:s:3 sub.srt
4.1.2 添加字幕流
添加1个字幕流
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=en IceAge3.en.mp4
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -map 0 -map 1 -c copy -c:s mov_text IceAge3.en1.mp4
在已有字幕的基础上添加新字幕
ffmpeg -i IceAge3.en.mp4 -i sub.chinese.srt -map 0 -map 1 -c copy -c:s mov_text IceAge3.encn.mp4
添加多个字幕流
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -i sub.chinese.srt -i sub.ass.en.ass -map 0 -map 1 -map 2 -map 3 -c copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn -metadata:s:s:2 language=en.ass IceAge3sub.mp4
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -i sub.chinese.srt -i sub.ass.en.ass -map 0 -map 1 -map 2 -map 3 -c copy -c:s mov_text IceAge3sub.mp4
$ ffmpeg -i Trese.avi -i en.srt -i CN.srt -map 0:v -map 0:a -map 1 -map 2 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn out2.mp4
$ ffmpeg -i Trese.avi -i en.srt -i CN.srt -map 0 -map 0:s:0 -map 0:s:1 -map 0:s:2 -c copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn out2.mp4
4.1.3 注意
不指定map则无效
ffmpeg -i input.mp4 -i sub.srt -c copy out.mp4
ffmpeg -i input.mp4 -i sub.srt -map 0 -c copy out.mp4
如下语法, 对于mp4无效, 对于mkv,则会增加字幕.
ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy out.mp4
$ ffmpeg -i input.mkv -i sub.srt -map 0 -map 1 -c copy out.mkv
完整语法:
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text out.mp4
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 title=en out.mp4
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=en out.mp4
4.2 硬字幕(不推荐)
将字幕嵌入到视频帧中,这个过程需要重新编解码,所以速度比较慢。而且不可逆.
https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo
您可以使用以下两种过滤器之一来刻录文本字幕(硬字幕):subtitles或ass.
subtitles 滤镜
http://ffmpeg.org/ffmpeg-filters.html#subtitles-1
ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi
ass 滤镜
http://ffmpeg.org/ffmpeg-filters.html#ass
ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
它仅限于ASS(高级变电站阿尔法)字幕文件, 所以若是SubRip,MicroDVD或任何其他支持的文本字幕,您必须在使用此过滤器之前将其转换为 ASS:
https://trac.ffmpeg.org/wiki/HowToConvertSubtitleToASS
ffmpeg -i subtitle.srt subtitle.ass
基于图片的字幕
你可以燃烧“基于图像的”字幕到一部电影中,通过使用叠加视频滤波器以覆盖图像。例如,dvdsub 是一种基于图片的叠加字幕。在单独的流中带有 dvdsub 字幕的 MKV 示例:
ffmpeg -i input.mkv -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a <output options> output.mkv
5. 相关链接
https://www.cnblogs.com/sztom/p/11964797.html
https://www.cnblogs.com/sztom/p/11909360.html
https://szosoft.blogspot.com/2019/11/ffmpeg-01-subtitle.html
https://en.wikipedia.org/wiki/Subtitles
https://zh.wikipedia.org/wiki/字幕
https://en.wikipedia.org/wiki/Comparison_of_subtitle_editors
https://en.wikipedia.org/wiki/Comparison_of_video_player_software#Subtitle_ability
https://en.wikipedia.org/wiki/Speech_recognition
https://zh.wikipedia.org/wiki/语音识别
https://translations.ted.com/How_to_Compress_Subtitles