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.10和0:00:00.20,正好相差一个帧延迟的时间。
第二项:{\an7}{\pos(!pos_x!, !pos_y!)}
{\an7}将字幕的原点设置为了左上角,{\pos()}则设置了字幕的位置(pos_x和pos_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编辑,保留原作者信息可自由转载。