实际上不算是歌词特效,只能说是一段自动化template的简单应用。
截图
代码
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code syl all,fxgroup.firstsyl = syl.i == 1
Dialogue: 0,1:01:01.55,1:01:02.55,Default,毫秒,0,0,0,template fxgroup firstsyl notext,!maxloop(math.floor($ldur/1000*24))!!retime("preline",1000/24*(j-1),1000/24*j)!!string.format("%02d:%02d:%02d:%03d",math.floor(($lstart/1000*24+j-1)/(24*3600)),math.floor(($lstart/1000*24+j-1)/(24*60)) % 60,math.floor(($lstart/1000*24+j-1)/(24)) % 60,($ldur+(j-1)*1000/24)%1000)!
Comment: 0,1:01:01.55,1:01:02.55,Default,帧,0,0,0,template fxgroup firstsyl notext,!maxloop(math.floor($ldur/1000*24))!!retime("preline",1000/24*(j-1),1000/24*j)!!string.format("%02d:%02d:%02d:%02d",math.floor(($lstart/1000*24+j-1)/(24*3600)),math.floor(($lstart/1000*24+j-1)/(24*60)) % 60,math.floor(($lstart/1000*24+j-1)/(24)) % 60,(math.floor($lstart/1000*24)+j-1) % 24)!
Dialogue: 0,1:15:01.55,1:16:51.55,Default,,0,0,0,karaoke,这句话的起始时间是时间戳生成的起始点\N格式:h:mm:ss:frame,frame为0-23(按照24fps生成)
改了两个小版本,打了comment说话人是毫秒
的,格式为hh:mm:ss:msmsms
未打comment,说话人是帧
的,格式为h:mm:ss:frameframe
算法和函数
绝对帧数
选用了从0:00:00.00开始计数的绝对帧数$lstart/1000*24+j-1
,并进行帧和时分秒之间的换算。
string.format
Lua/Java中使用string.format()
格式化字符串。
string.format()
第一个参数为字符串格式,后面的参数可以任意多个,用于填充第一个参数中的格式控制符,最后返回完整的格式化后的字符串。
控制符
格式控制符以%开头,常用的有以下几种。
%c
– 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i
– 接受一个数字并将其转化为有符号的整数格式
%o
– 接受一个数字并将其转化为八进制数格式
%u
– 接受一个数字并将其转化为无符号整数格式
%x
– 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X
– 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e
– 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E
– 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f
– 接受一个数字并将其转化为浮点数格式
%g(%G)
– 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q
– 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s
– 接受一个字符串并按照给定的参数格式化该字符串
参数
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:
(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f
)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s
)则设定该字符串只显示前n位.
例子
string.format("%02d:%02d:%02d:%03d",A,B,C,D)
表示将A B C D补到2 2 2 3位,并以:
连接。