Welcome

首页 / 编程脚本 / ass2srt.vbs(ass/ssa批量转换srt的脚本)

iPad中的OPlayer只支持srt格式的字幕,而动画一般使用的是ass/ssa格式的字幕,所以需要将ass/ssa批量转换srt。
Google了一下,在《ass2srt[ass/ssa批量转换srt]》中找到一个ass2srt.wsf脚本,内容如下:
<job id="ass2srt"><script language="JScript">cInput="unicode";// You can find them from:cOutput="utf-8";// HKEY_CLASSES_ROOTMIMEDatabaseCharsetfunction rrr(){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><script language="VBScript">set ad=CreateObject("adodb.stream")set af=CreateObject("adodb.stream")set ass=CreateObject("adodb.stream")ad.openaf.openass.openad.Charset=cInputaf.Charset=cOutputass.Charset=cOutputSet objArgs = WScript.ArgumentsFor I = 0 to objArgs.Count - 1ad.LoadFromFile(objArgs(I))z=0gg=left(objArgs(I),len(objArgs(I))-3)&"srt"Do While ad.eos <> Truess =ad.ReadText(-2)if left(ss,8)="Dialogue" then ss=replace(ss,",,",",d,")rrrt3=replace(t3,"
",vbcrlf)t3=replace(t3,"N",vbcrlf)z=z+1af.writetext z,1af.writetext t1 & " --> " & t2,1af.writetext t3 & vbcrlf & vbcrlfelse ass.writetext ss,1end ifLoopaf.savetofile gg,2ass.savetofile gg&".style",2Nextif i=0 then msgbox "Please drag files to me!",,"Error!"elsemsgbox "Converted "&i&" file(s).",,"All Over!"end if</Script></job>
Windows 脚本 (.wsf) 文件是一个包含可扩展标记语言(XML)代码的文本文档,它结合了若干功能,提高了脚本编程的灵活性。由于 Windows 脚本文件并不局限于特定的引擎,它们能够包含所有遵循 ActiveX(R)规范的脚本引擎的脚本。
上面的脚本文件同时包含了JScript和VBScript的代码。问题在于,有这个必要么?单纯用JScript或者VBScript都可以实现,为什么要混用不同的语言呢?JScript在代码中的作用仅仅是正则表达式而已,一个合理的推断是作者不会VBScript的正则表达式,或者嫌VBScript的正则表达式太麻烦。就算撇开语言混杂不说,上面代码的风格实在是不敢恭维。
下面是我写的ass2srt.vbs,也许比上面的代码好一点点罢。
Option ExplicitConst Encoding = "unicode" "assume unicode"Author: Demon"Website: http://demon.tw"Date: 2012/6/16Dim shell, folder, fso, ext, i, argsSet shell = CreateObject("Shell.Application")Set fso = CreateObject("scripting.filesystemobject")Set args = WScript.ArgumentsIf args.Count = 0 ThenSet folder = shell.BrowseForFolder(0, "请选择ASS字幕所在的文件夹", 1)If folder Is Nothing Then WScript.QuitFor Each i In fso.GetFolder(folder.Self.Path).Filesext = LCase(fso.GetExtensionName(i.Path))If ext = "ass" Or ext = "ssa" ThenASS2SRT i.Path, EncodingEnd IfNextElseFor i = 0 To args.Count - 1ASS2SRT args(i), EncodingNextEnd IfMsgBox CInt(i) & " file(s) Converted!", vbInformationFunction ASS2SRT(path, charset)Const adTypeText = 2Const adReadLine = -2Const adSaveCreateOverWrite = 2Dim ass, srt, re, str, arr, s, e, t, iSet ass = CreateObject("ADODB.Stream")Set srt = CreateObject("ADODB.Stream")Set re = New RegExpre.Global = Truere.IgnoreCase = Truere.Pattern = "{.*?}"ass.Type = adTypeTextass.Charset = charsetass.Openass.LoadFromFile pathsrt.Type = adTypeTextsrt.Charset = "utf-8"srt.Openi = 0Do Until ass.EOSstr = ass.ReadText(adReadLine)If Left(str, 8) = "Dialogue" Theni = i + 1arr = Split(str, ",", 10)s = "0" & arr(1) & "0" "Start timee = "0" & arr(2) & "0" "End timet = arr(9) "Texts = Replace(s, ".", ",")e = Replace(e, ".", ",")t = re.Replace(t, "")t = Replace(t, "
", vbCrLf)t = Replace(t, "N", vbCrLf)srt.WriteText i & vbCrLfsrt.WriteText s & " --> " & e & vbCrLfsrt.WriteText t & vbCrLf & vbCrLfEnd IfLooppath = Left(path, Len(path) - 3) & "srt"srt.SaveToFile path, adSaveCreateOverWriteEnd Function
把上面代码保存为ass2srt.vbs,然后将需要转换的ass/ssa字幕拖动到ass2srt.vbs脚本上即可。如果需要批量转换的ass/ssa字幕比较多,可以先把它们放到同一个文件夹里,然后直接双击运行ass2srt.vbs,选择字幕所在的文件夹即可。
原文:http://demon.tw/my-work/ass2srt.html