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

视频:DV时间抽取后在视频上添加时间字幕

2022-9-7 11:26:48

摄像机拍摄的mini DV格式的视频中有时间码,通过软件可以抽取其中的时间码生成DVDT文件。

由于低版本的PR是不支持直接从DV中抽取时间码生成字幕的,因此可以导出为SRT格式后,在PR里添加字幕。

对于后面对DV进行了剪辑,可以从DVDT文件中直接选取剪辑的部分进行转换。


'DV导出的DVDT中找出时间段,生成时间字幕SRT
'DVDT:
'00000001 03 05 17 10 51 03
'00000022
'SRT:
'1 序号
'00:00:00,000 --> 00:00:02,000 时长
'2022-03-01 文本
'空行

const myFPS=25 '视频每秒帧数
const myPreText="" '字幕文本开头前缀 可用<font color=red>、<i>、<u>、<br>、<b>
const myAddText="" '字幕文本结尾附加
const dvdtfilename="F:\软件测试\生成字幕\2003.10.4-1.dvdt" 'DVDT文件 可以选取其中一部分
const srtfilename="F:\软件测试\生成字幕\20031002.SRT" 'SRT字幕文件名

'运行前,请先配置上面的参数
Dim line,timeStr,curTime,curText
line=1
curTime="00:00:00,000"


dim fs,f1,f2,s1,s2
Set fs = CreateObject("Scripting.FileSystemObject")
set f1=fs.opentextfile(dvdtfilename)
set f2=fs.createtextfile(srtfilename,true)

s1=Split(f1.ReadLine," ")
If ubound(s1)=6 Then
  do while f1.AtEndOfStream<>true
    s2=Split(f1.ReadLine," ")
    timeStr=curTime
    curTime=getTime(curTime,s2(0)-s1(0))
    timeStr=timeStr & " --> " & curTime
    call wirteSrt(f2,line,timeStr,formatText(s1))
    line=line+1
    If ubound(s2)=6 Then
      s1=s2
    Else
      Exit do
    End if

  loop
End if
f2.close
msgbox line & " SRT ok"

function formatText(s)
  If s(1)<2000 Then s(1)=s(1)+2000
  formatText=s(1) & "-" & s(2) & "-" & s(3) & " " & s(4) & ":" & s(5) & ":" & s(6)
end function

function formatDate(d)
  formatDate=year(d) & "-" & right("0" & month(d),2) & "-" & right("0" & day(d),2)
end function
function formatTime(d)
  formatTime=formatdatetime(d,4) & ":" & right("0" & second(d),2)
end function

function getTime(curTime,frames)
  dim myInt,myDec
  myInt=Int(frames/myFPS)
  myDec=frames/myFPS-myInt

  myDec=cint(split(curTime,",")(1))+cint(myDec*1000)
  if myDec>=1000 then
    myInt=myInt+1
    myDec=myDec mod 1000
  end If
  getTime=formatTime(dateadd("s",myInt,cdate("2022-05-01 " & split(curTime,",")(0)))) & "," & right("000" & myDec,3)
end function

function wirteSrt(f,line,timeStr,curText)
  f.writeline line
  f.writeline timeStr
  f.writeline curText
  f.writeline ""
end function