当前位置:首页 -少年百科 - 大杂烩 - PC与手机 - 正文*

视频:为延时摄影后期PR制作生成SRT时间字幕文件( VBS)

2022-5-4 22:01:28

延时摄影后期在电脑上制作时,可以加上时钟字幕,表现拍摄时的时刻。使用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


延时摄影拍摄见:朱顶红花开过程延时摄影