Aegisub中插入GIF动图完全指南!

Aegisub中本不支持插入图片,但是使用插件VSFilterMod后,可以在ass字幕中以png图片作为颜色填充。

即便这样,仍不能在ass中插入gif动图。不过可以将gif转变为png图片序列,再由aegisub自带的自动化功能连续播放图片,即可模仿gif动图的效果。

有了可以插入gif的方法,我们就可以利用aegisub在ass内插入任意动态效果甚至视频的能力。

本文由小Hshan编辑,保留原作者信息可自由转载。


在此处下载示例压缩包,除Aegisub本体外,另外三款软件均已附带:链接:https://pan.baidu.com/s/1lvNR2R7giV0K0P9RiN1FGQ  提取码:scci

本文必要软件:

Aegisub高级字幕编辑器3.2.2 :http://www.aegisub.org/

VSFilterMod x86版本 :https://github.com/sorayuki/VSFilterMod/releases/tag/r5.2.1

本文推荐软件:

FFmpeg Windows EXE Files :https://www.ffmpeg.org/download.html

GifCam :http://blog.bahraniapps.com/gifcam/


步骤1 配置VSFilterMod

下载GitHub上的VSFilterMod发布版本,选择x86版本进行解压,得到VSFilterMod.dll

将此dll文件放入Aegisub的安装文件夹的csri文件夹中

然后启动aegisub,在工具栏-查看-选项-高级-视频-字幕来自中选择CSRI/vsfiltermod textsub


点击确认,VSFilterMod配置完毕。


步骤2 查看gif图片帧延迟和编辑gif图片

使用GifCam软件,打开你的gif图片。


打开后点击Edit 编辑按钮,打开编辑窗口。


你可以在这个编辑窗口看到帧延迟(每一帧的持续时间),记住这个值,在后面会用到。值得注意的是,gif允许每帧的帧延迟不相等,但是本文提供的方法插入的gif图片的每一帧的延迟均是相等的。如果一定要不相等的时间,可以在应用卡拉ok模板后,手动调整应用后自动生成的字幕行的时间。

你还可以在这个窗口右键帧,然后对gif图片进行删除某帧、调整大小、添加文字等等操作。

编辑完成后关闭编辑窗口,点击Save按钮保存。




步骤3 将gif动图分解为png图片序列

此处将利用ffmpeg作为示范。

下载并解压ffmpeg Windows EXE 版本,得到ffmpeg.exe文件。

新建一文件夹用于存放输出的png图片。

打开新建的文件夹,在工具栏中输入cmd,回车,打开以当前目录为工作目录的命令指示符。



然后输入ffmpeg.exe的路径 -r 1 -i gif图片的路径 -f image2 输出名字%d.png

输入完成后回车,即可在当前文件夹生成png图片序列。

关于在cmd中输入路径的方法:按住shift后再右键文件,可以看到“复制为路径”选项,复制后在cmd中粘贴即可。

例如:"C:\Users\Desktop\ffmpeg.exe" -r 1 -i "C:\Users\Desktop\slime.gif" -f image2 slime%d.png


注意:其中的每一项参数之间均有空格,以及最后的.png前面必须要有%d

如果操作正确,此时可以在文件夹中看到生成的png序列。


步骤4 在Aegisub中应用卡拉ok模板

本例子使用图片填充一个矢量矩形作为示范,以展示出完整的图片样貌。实际上图片可以填充到任何需要填充颜色的地方,例如文字的主要颜色,文字的边框颜色等。

关键字幕行代码:

Comment: 0,0:00:00.00,0:00:05.00,GIF,,0,0,0,code once,png_file_name = "slime"; png_width = 256; png_height = 256; frames_count = 2; frame_delay = 250; pos_x = 0; pos_y = 0;

Comment: 0,0:00:00.00,0:00:05.00,GIF,,0,0,0,template line loop 50,!retime("line", (j-1)*frame_delay, ((j-1)*frame_delay)+frame_delay-line.duration)!{\an7}{\pos(!pos_x!, !pos_y!)}{\1img(!png_file_name!!((j+frames_count-1)%frames_count)+1!.png)}{\p1}m 0 0 l !png_width! 0 l !png_width! !png_height! l 0 !png_height! | 0 0

Comment: 0,0:00:00.00,0:00:15.00,GIF,,0,0,0,karaoke,

复制上述三行字幕行代码,在aegisub的字幕区中右键-粘贴行,即可快速粘贴字幕行。


需要在code once行中修改的参数有:

png_flie_path : png序列的路径,不包含数字后缀和.png后缀名。

如"slime"(相对路径)、"C:\\Users\\Hshan\\Desktop\\slime"(绝对路径 注意反斜杠需要改为双反斜杠)。使用的路径需要用半角双引号引用,并且推荐使用纯英文路径。

png_width : png图片像素宽度。

png_height : png图片像素高度。

frames_count : png图片序列总张数。

frame_delay : 每帧延迟(持续)时间(毫秒)。

pos_x : 图片x轴位置。

pos_y : 图片y轴位置。(原点为图片左上角{\an7})

需要修改template line loop XX 的值:XX的值为png图片序列总张数的整数倍。

例如,你的gif图片共有24帧,则若写template line loop 24 ,则动图循环播放一次;若写template line loop 48 ,则动图循环播放两次,以此类推。若不是整数倍则最后一次播放不能完全把动图播放完。

最后:修改karaoke行的起始时间。即特效栏填写着karaoke的空行 特效栏填写着karaoke的字幕行也被称为被应用行。此行的起始时间便是动图开始的时间。因为使用了retime函数,所以此行的结束时间并不重要。结束时间受template line loop XX 的值的影响。

在修改完上述参数后,点击工具栏-自动化-应用卡拉ok模板,即可看到自动生成的字幕行,播放即可看到动图效果。



如果发现图片背景为黑色,把GIF样式的边框和阴影改为0像素即可。

如果需要用动图填充字幕文字颜色,则需要把template line loop XX行的{\p1}m 0 0 l !png_width! 0 l !png_width! !png_height! l 0 !png_height! | 0 0 删除,改为文字即可。

例如改为:

!retime("line", (j-1)*frame_delay, ((j-1)*frame_delay)+frame_delay-line.duration)!{\an7}{\pos(!pos_x!, !pos_y!)}{\1img(!png_file_name!!((j+frames_count-1)%frames_count)+1!.png)}用动图填充字幕颜色


注意,每次修改后均需要重新点击工具栏-自动化-应用卡拉ok模板,才能看到效果。


特效详解

第一项!retime("line", (j-1)*frame_delay, ((j-1)*frame_delay)+frame_delay-line.duration)!

函数声明:!retime(模式, 开始时间偏移, 结束时间偏移)!

retime函数用于改变自动生成的卡拉ok模板行(特效栏带有fx的行)的开始时间和结束时间。

模式为"line"的情况下,函数会将生成的fx行的开始时间重新设置为被应用行的开始时间,将生成的fx行的结束时间重新设置为被应用行的结束时间。在本例中,被应用行为:

所以在开始时间偏移和结束时间偏移均为0的情况下,生成的fx行的开始时间和结束时间会全部变成0:00:00.00和0:00:15.00

但为了让图片每隔frame_delay毫秒切换一次,需要将开始时间偏移设定为(j-1)*frame_delay

其中,j为一特殊变量,可以直接使用,它的值等于当前loop循环次数的值。

例如,在特效栏为 template line loop 10 时,点击应用卡拉ok模板按钮,每条被应用行将会被应用10次。也就是说,每条被应用的字幕行会生成10条fx行。其中第一条fx行的j值为1,第二条fx行的j值为2,以此类推。

所以当开始时间偏移设定为(j-1)*frame_delay 时,假设帧延迟frame_delay为0.1秒,即100ms,第一条fx行的开始时间就为0:00:00.00 + (1-1)*100 = 0:00:00.00 ;第二条fx行的开始时间就为0:00:00.00 + (2-1)*100 = 0:00:00.10 ;第三条fx行的开始时间就为0:00:00.00 + (3-1)*100 = 0:00:00.20 

结束时间偏移必须设定为((j-1)*frame_delay)+frame_delay-line.duration。其中line.duration为一特殊变量,可以直接使用,它的值为被应用行的持续时间,例子中为15秒(15000ms)。

所以当结束时间偏移设定为((j-1)*frame_delay)+frame_delay-line.duration 时,假设帧延迟frame_delay为0.1秒(100ms),第一条fx行的结束时间就为0:00:15.00 + (1-1)*100+100-15000 = 0:00:00.10 ;第二条fx行的开始时间就为0:00:00.00 + (2-1)*100+100-15000 = 0:00:00.20 ;第三条fx行的开始时间就为0:00:00.00 + (3-1)*100+100-15000 = 0:00:00.30 

综上,在帧延迟为0.1秒的情况下,第一条fx行的开始和结束时间分别是0:00:00.00和0:00:00.10 第二条fx行的开始和结束时间是0:00:00.100:00:00.20,正好相差一个帧延迟的时间。

第二项{\an7}{\pos(!pos_x!, !pos_y!)}

{\an7}将字幕的原点设置为了左上角,{\pos()}则设置了字幕的位置(pos_xpos_y的值是在code once行中手动输入的)。

第三项{\1img(!png_file_name!!((j+frames_count-1)%frames_count)+1!.png)}

函数声明:{\$img(图片路径, x轴偏移, y轴偏移)}

\img函数用于将图片代替纯色进行填充。其中,$的值可选为1、2、3、4中的一个。1代表主要颜色;2代表次要颜色;3代表边框颜色;4代表阴影颜色。x轴y轴偏移属于可选值。

本函数的第一项为!png_file_name!!((j+frames_count-1)%frames_count)+1!.png 其中png_file_name是png序列的名字,但不包括数字编号和后缀名。图片的数字编号是由((j+frames_count-1)%frames_count)+1负责。这个值恰好能与j以及frames_count构成循环,让图片编号始终在1~frames_count之间循环,实现了模拟gif动图循环播放的感觉。

第四项:{\p1}m 0 0 l !png_width! 0 l !png_width! !png_height! l 0 !png_height! | 0 0

这一项的主要目的是创建一个和图片一样大的矢量矩形。如果要用图片填充文字则要把这项删除改为文字。


若有机会再写如何将使用了VSFilterMod的ass字幕压制进入视频内。

本文由小Hshan编辑,保留原作者信息可自由转载。

你可能感兴趣的:(Aegisub中插入GIF动图完全指南!)