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编辑,保留原作者信息可自由转载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容