ass2srt.vbs(ass/ssa批量转换srt的脚本)
iPad中的OPlayer只支持srt格式的字幕,而动画一般使用的是ass/ssa格式的字幕,所以需要将ass/ssa批量转换srt。
Google了一下,在《ass2srt[ass/ssa批量转换srt]》中找到一个ass2srt.wsf脚本,内容如下:
<jobid="ass2srt">
<scriptlanguage="JScript">
cInput="unicode";//Youcanfindthemfrom:
cOutput="utf-8";//HKEY_CLASSES_ROOT\MIME\Database\Charset
functionrrr(){
re=/Dialogue:[^,.]*[0-9]*,([1-9]?[0-9]*:[0-9]*:[0-9]*.[0-9]*),([1-9]?[0-9]*:[0-9]*:[0-9]*.[0-9]*),[^,.]*,[^,.]*,[0-9]*,[0-9]*,[0-9]*,[^,.]*,(.*)/gi;
rv=ss.match(re);
t1=RegExp.$1;
t2=RegExp.$2;
t3=RegExp.$3;
rg=/\{[^}.]*(\\pos\([0-9]*,[0-9]*\))[^}.]*}/gi;
t3=t3.replace(rg,"$1"+"}");
rg=/\{[^}.]*}/gi;
t3=t3.replace(rg,"");
rg=/(\\pos\([0-9]*,[0-9]*\)})/gi;
t3=t3.replace(rg,"{"+"$1");
}
</Script>
<scriptlanguage="VBScript">
setad=CreateObject("adodb.stream")
setaf=CreateObject("adodb.stream")
setass=CreateObject("adodb.stream")
ad.open
af.open
ass.open
ad.Charset=cInput
af.Charset=cOutput
ass.Charset=cOutput
SetobjArgs=WScript.Arguments
ForI=0toobjArgs.Count-1
ad.LoadFromFile(objArgs(I))
z=0
gg=left(objArgs(I),len(objArgs(I))-3)&"srt"
DoWhilead.eos<>True
ss=ad.ReadText(-2)
ifleft(ss,8)="Dialogue"then
ss=replace(ss,",,",",d,")
rrr
t3=replace(t3,"\n",vbcrlf)
t3=replace(t3,"\N",vbcrlf)
z=z+1
af.writetextz,1
af.writetextt1&"-->"&t2,1
af.writetextt3&vbcrlf&vbcrlf
else
ass.writetextss,1
endif
Loop
af.savetofilegg,2
ass.savetofilegg&".style",2
Next
ifi=0then
msgbox"Pleasedragfilestome!",,"Error!"
else
msgbox"Converted"&i&"file(s).",,"AllOver!"
endif
</Script>
</job>
Windows脚本(.wsf)文件是一个包含可扩展标记语言(XML)代码的文本文档,它结合了若干功能,提高了脚本编程的灵活性。由于Windows脚本文件并不局限于特定的引擎,它们能够包含所有遵循ActiveX(R)规范的脚本引擎的脚本。
上面的脚本文件同时包含了JScript和VBScript的代码。问题在于,有这个必要么?单纯用JScript或者VBScript都可以实现,为什么要混用不同的语言呢?JScript在代码中的作用仅仅是正则表达式而已,一个合理的推断是作者不会VBScript的正则表达式,或者嫌VBScript的正则表达式太麻烦。就算撇开语言混杂不说,上面代码的风格实在是不敢恭维。
下面是我写的ass2srt.vbs,也许比上面的代码好一点点罢。
OptionExplicit
ConstEncoding="unicode"'assumeunicode
'Author:Demon
'Website:http://demon.tw
'Date:2012/6/16
Dimshell,folder,fso,ext,i,args
Setshell=CreateObject("Shell.Application")
Setfso=CreateObject("scripting.filesystemobject")
Setargs=WScript.Arguments
Ifargs.Count=0Then
Setfolder=shell.BrowseForFolder(0,"请选择ASS字幕所在的文件夹",1)
IffolderIsNothingThenWScript.Quit
ForEachiInfso.GetFolder(folder.Self.Path).Files
ext=LCase(fso.GetExtensionName(i.Path))
Ifext="ass"Orext="ssa"Then
ASS2SRTi.Path,Encoding
EndIf
Next
Else
Fori=0Toargs.Count-1
ASS2SRTargs(i),Encoding
Next
EndIf
MsgBoxCInt(i)&"file(s)Converted!",vbInformation
FunctionASS2SRT(path,charset)
ConstadTypeText=2
ConstadReadLine=-2
ConstadSaveCreateOverWrite=2
Dimass,srt,re,str,arr,s,e,t,i
Setass=CreateObject("ADODB.Stream")
Setsrt=CreateObject("ADODB.Stream")
Setre=NewRegExp
re.Global=True
re.IgnoreCase=True
re.Pattern="\{.*?\}"
ass.Type=adTypeText
ass.Charset=charset
ass.Open
ass.LoadFromFilepath
srt.Type=adTypeText
srt.Charset="utf-8"
srt.Open
i=0
DoUntilass.EOS
str=ass.ReadText(adReadLine)
IfLeft(str,8)="Dialogue"Then
i=i+1
arr=Split(str,",",10)
s="0"&arr(1)&"0"'Starttime
e="0"&arr(2)&"0"'Endtime
t=arr(9)'Text
s=Replace(s,".",",")
e=Replace(e,".",",")
t=re.Replace(t,"")
t=Replace(t,"\n",vbCrLf)
t=Replace(t,"\N",vbCrLf)
srt.WriteTexti&vbCrLf
srt.WriteTexts&"-->"&e&vbCrLf
srt.WriteTextt&vbCrLf&vbCrLf
EndIf
Loop
path=Left(path,Len(path)-3)&"srt"
srt.SaveToFilepath,adSaveCreateOverWrite
EndFunction
把上面代码保存为ass2srt.vbs,然后将需要转换的ass/ssa字幕拖动到ass2srt.vbs脚本上即可。如果需要批量转换的ass/ssa字幕比较多,可以先把它们放到同一个文件夹里,然后直接双击运行ass2srt.vbs,选择字幕所在的文件夹即可。
原文:http://demon.tw/my-work/ass2srt.html