(原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

Author:lihaiping1603@aliyun.com

Create:2019-09-04

最近对ffmpeg给视频文件添加字幕效果,进行了一些调试和研究,个人做个笔记,方便以后查找和使用。

将字幕加入到视频文件中,有两种方式:

1)第一种是将字幕以除了音视频之外的字幕流的形式添加到视频文件格式中,然后播放器在播放这个视频文件的时候,就可以显示相应的字幕效果了,该方式对于已经存在的视频文件,可以不用对音视频进行转码,速度和效率较高,但缺陷是对于一些格式不支持一些字幕编码格式,例如mp4不支持ass编码格式字幕流,而mkv支持。所以对于mkv格式的视频文件,我们可以利用如下的命令方式直接添加字幕流:

Ffmpeg -i video.mp4 -i subtitle.ass -c:v copy -c:a copy -c:s ass -y dest.mkv

2) 另外一种方式是将字幕流烧录到视频流中,即当成视频效果的一部分,通过字幕滤镜处理。优点是支持所有的视频文件格式,缺点是需要对原视频中的视频流进行转码处理,耗时耗硬件资源。例如将字幕文件烧录进mp4,可以利用如下的命令方式直接添加字幕:ffmpeg -i video.mp4 -vf ass=subtitle.ass -y dest.mp4

3) 同时这里介绍一下aas格式中的一些不是特别好理解的东西(相关基础资料可以参考:

aas文件格式介绍:

https://blog.csdn.net/winglyx/article/details/6791719;

https://www.douban.com/note/658520175/;

ass特效标签介绍:

https://aegi.vmoe.info/docs/3.2/ASS_Tags/;)

针对字幕显示的位置,如何在ass中指定呢?这里我找到两个相关的字段anpos这两个字段:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

这个是an的介绍,我们假设我们是在一个虚拟的字幕输入框中输入我们的字幕,那么这个an的方式设置其实就是针对字幕输入框中当我们输入字幕的时候,这些字幕是如何在输入框中从什么位置开始展开的,也即以为字幕输入框的参考点设置,例如当我们设置为an5的时候,那么输入字幕的时候,参考点为输入框的中心,所以字幕增加的时候,就会在输入框向两边拓展展示。下面我们在确定posan的时候,字幕输入不同的字数的时候的截图如下:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

所以an5,即输入框的参考点为输入框的中心位置。

接下来,我们再聊一下pos的问题:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

pos指定的位置是基于原始视频画布的物理坐标,画布左上角为pos(0,0),右下角为pos(width/2,height/2);所以我们这里来看一下pos(0,0)的时候,改变an的参考点对齐方式,他的效果是怎么样的,看了,也许你就明白了。

An4_pos0_0:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

An5_pos0_0:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

An7_pos0_0:

 (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

 这里更正一下:

上面的测试是在视频文件分辨率为968x544的分辨率的基础上,使用ass文件内容如下的测试结果。

ass文件内容:(注意script info中没有指定视频分辨率)

[Script Info]
; Script generated by Aegisub 3.2.2
; http://www.aegisub.org/
Title: YYeTs
; Original Script: YYeTs
Synch Point: 0
ScriptType: v4.00+
Timer: 100.0000
ScaledBorderAndShadow: no
YCbCr Matrix: TV.601
WrapStyle: 0


[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,SourceHanSerifCN-Regular,20,&H00F83C4A,&H00000000,&H00442121,&H00000000,0,0,0,0,100,100,0,0,1,1,1,2,5,5,2,134

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:11.04,*Default,NTP,0,0,0,,{an5pos(0,0)}Hi,我是沐雨橙风

当修改ass中的script info的时候,会出现pos不同的情况,例如在script info中加入

PlayResX: 968
PlayResY: 544

指明视频的实际分辨率的时候,最右下角的坐标将变为pos(968,544),就不再是pos(484,272)了,至于在不指定的情况下,为啥会为1/2,暂时还没找到相关资料查证。

上述过程如果有误,请留言一起交流和更正整个过程。谢谢!

转载请注明出处:https://www.cnblogs.com/lihaiping/p/11460790.html