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