延时摄影后期在电脑上制作时,可以加上时钟字幕,表现拍摄时的时刻。使用PR制作时,可以通过导入字幕文件的方式来实现。
PR一般可以导入STL、SRT格式的字幕文件。
使用STL格式相对容易,一条字幕一行,每行包括三个字段,用逗号分开。分别是起始时间,终止时间,字幕文本。如:
00:00:00:00,00:00:01:00,2022-03-01
这种格式简单,用Excel等都可以制作中有规律的时间变化的字幕。注意终止时间要与下一个起始时间重合,而不是00:00:00:99。这样会差一帧,字幕会闪动。
笔者在使用这种格式导入时,在PR里一直会少一帧,导致闪动。因此后来改用SRT格式导入。
SRT格式的字幕,每字幕有4行,相对比较复杂。但功能比较多,如字幕支持代码:<font color=red>颜色</font>,<i>字体斜体</i>,<u>字体下加划线</u>,<br>换行,<b>字体加粗</b>等。而且导入到PR里,字幕衔接不闪动。
要生成SRT格式的字幕,可以先用Excel 生成STL格式,然后在网上找在线转换字幕的网站,转换成SRT格式。
因为经常要用,笔者用VBS写了一个代码,可以自动生成延时摄影的时间字幕。要用的时候,只须设置了参数,就可直接生成SRT文件。
SRT文件在导入PR时,要在字幕面板先预设好导入的配置参数,比如字幕文本大小、颜色、位置等。
以下是代码,根据需要修改参数,保存为"字幕.vbs",执行即可得到SRT文件(如何是中文字幕,文件规格要保存为utf8-bom)。
提示:如果不是延时拍摄,而是正常拍摄,也可以生成时间字幕,这个时候需要设置
myFPS=25 ,myTextFrames=25,mySPF=0.04:其中相当于每拍一张要1/25
'延时摄影生成时间字幕SRT
'line1 1 序号
'line2 00:00:00,000 --> 00:00:02,000 时长
'line3 2022-03-01 文本
'line4 空行
Const myFPS = 25 '视频每秒帧数
Const myTextFrames = 1 '视频每条字幕显示帧数
Const mySPF = 600 '拍摄一张的秒数
Const myTextBegin = "2023-03-05 16:36:37" '拍摄时间起始
Const myTextEnd = "2023-03-12 22:46:39" '拍摄时间结束
Const myPreText = "" '字幕文本开头前缀
Const myAddText = "" '字幕文本结尾附加
Const filename = "E:\CGZ_备份视频\未同步20210411\延时\风信子\20230305.SRT" 'SRT字幕文件名
'运行前,请先配置上面的参数
Dim myTimeStep,MyTextStep
myTimeStep = myTextFrames / myFPS '字幕时长增加。以秒为单位,可能为小数
MyTextStep = mySPF * myTextFrames '字幕文本的增加。以秒为单位,只为整数
Dim line,curTime,curText,timeStr
line = 1
curTime = "00:00:00,000"
curText = CDate(MyTextBegin)
Dim fs,f
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.createtextfile(filename,True)
Do while curText <= CDate(MyTextEnd)
timeStr = curTime
curTime = getTime(curTime,myTimeStep)
timeStr = timeStr & " --> " & curTime
Call wirteSrt(f,line,timeStr,formatText(curText))
curText = DateAdd("s",MyTextStep,curText)
line = line + 1
Loop
f.close
MsgBox line & " SRT ok"
Function formatText(curText)
'格式化字幕文本,为避免秒数、分钟不变,用随机数
'%10=0 秒个位不变
'%60=0 秒都不变
'%600=0 分个位不变
'%3600=0 分都不变
If mySPF Mod 3600 = 0 Then
formatText = formatDate(curText) & " " & byte2(Hour(curText)) & ":" & byte2(Rnd() * 60) & ":" & byte2(Rnd() * 60)
ElseIf mySPF Mod 600 = 0 Then
formatText = formatDate(curText) & " " & Left(FormatDateTime(curText,4),4) & Right(CInt(Rnd() * 10),1) & ":" & byte2(Rnd() * 60)
ElseIf mySPF Mod 30 = 0 Then
formatText = formatDate(curText) & " " & FormatDateTime(curText,4) & ":" & byte2(Rnd() * 60)
ElseIf mySPF Mod 10 = 0 Then
formatText = formatDate(curText) & " " & FormatDateTime(curText,4) & ":" & Left(byte2(Second(curText)),1) & Right(CInt(Rnd() * 10),1)
Else
formatText = formatDate(curText) & " " & FormatDateTime(curText,4) & ":" & byte2(Second(curText))
End If
End Function
Function formatDate(d)
formatDate = Year(d) & "-" & byte2(Month(d)) & "-" & byte2(Day(d))
End Function
Function byte2(n)
byte2 = Right("0" & CInt(n),2)
End Function
Function getTime(curTime,myTimeStep)
'取得字幕时间
Dim myInt,myDec
myInt = Int(myTimeStep)
myDec = myTimeStep - myInt
If myDec > 0 Then
' 不是整数秒
myDec = CInt(Split(curTime,",")(1)) + CInt(myDec * 1000)
If myDec >= 1000 Then
myInt = myInt + 1
myDec = myDec Mod 1000
End If
End If
getTime = formatTime(DateAdd("s",myInt,CDate("2022-05-01 " & Split(curTime,",")(0)))) & "," & Right("000" & myDec,3)
End Function
Function formatTime(d)
formatTime = FormatDateTime(d,4) & ":" & Right("0" & Second(d),2)
End Function
Function wirteSrt(f,line,timeStr,curText)
f.writeline line
f.writeline timeStr
f.writeline curText
f.writeline ""
End Function
延时摄影拍摄见:朱顶红花开过程延时摄影