這篇文章主要介紹了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_ROOT/MIME/Database/Charset
- function 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.open
- af.open
- ass.open
- ad.Charset=cInput
- af.Charset=cOutput
- ass.Charset=cOutput
- Set objArgs = WScript.Arguments
- For I = 0 to objArgs.Count - 1
- ad.LoadFromFile(objArgs(I))
- z=0
- gg=left(objArgs(I),len(objArgs(I))-3)&"srt"
- Do While ad.eos <> True
- ss =ad.ReadText(-2)
- if left(ss,8)="Dialogue" then
- ss=replace(ss,",,",",d,")
- rrr
- t3=replace(t3,"/n",vbcrlf)
- t3=replace(t3,"/N",vbcrlf)
- z=z+1
- af.writetext z,1
- af.writetext t1 & " --> " & t2,1
- af.writetext t3 & vbcrlf & vbcrlf
- else
- ass.writetext ss,1
- end if
- Loop
- af.savetofile gg,2
- ass.savetofile gg&".style",2
- Next
- if i=0 then
- msgbox "Please drag files to me!",,"Error!"
- else
- msgbox "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 Explicit
- Const Encoding = "unicode" 'assume unicode
- 'Author: Demon
- 'Website: http://demon.tw
- 'Date: 2012/6/16
- Dim shell, folder, fso, ext, i, args
- Set shell = CreateObject("Shell.Application")
- Set fso = CreateObject("scripting.filesystemobject")
- Set args = WScript.Arguments
- If args.Count = 0 Then
- Set folder = shell.BrowseForFolder(0, "請選擇ASS字幕所在的文件夾", 1)
- If folder Is Nothing Then WScript.Quit
- For Each i In fso.GetFolder(folder.Self.Path).Files
- ext = LCase(fso.GetExtensionName(i.Path))
- If ext = "ass" Or ext = "ssa" Then
- ASS2SRT i.Path, Encoding
- End If
- Next
- Else
- For i = 0 To args.Count - 1
- ASS2SRT args(i), Encoding
- Next
- End If
- MsgBox CInt(i) & " file(s) Converted!", vbInformation
- Function ASS2SRT(path, charset)
- Const adTypeText = 2
- Const adReadLine = -2
- Const adSaveCreateOverWrite = 2
- Dim ass, srt, re, str, arr, s, e, t, i
- Set ass = CreateObject("ADODB.Stream")
- Set srt = CreateObject("ADODB.Stream")
- Set re = New RegExp
- re.Global = True
- re.IgnoreCase = True
- re.Pattern = "/{.*?/}"
- ass.Type = adTypeText
- ass.Charset = charset
- ass.Open
- ass.LoadFromFile path
- srt.Type = adTypeText
- srt.Charset = "utf-8"
- srt.Open
- i = 0
- Do Until ass.EOS
- str = ass.ReadText(adReadLine)
- If Left(str, 8) = "Dialogue" Then
- i = i + 1
- arr = Split(str, ",", 10)
- s = "0" & arr(1) & "0" 'Start time
- e = "0" & arr(2) & "0" 'End time
- 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.WriteText i & vbCrLf
- srt.WriteText s & " --> " & e & vbCrLf
- srt.WriteText t & vbCrLf & vbCrLf
- End If
- Loop
- path = Left(path, Len(path) - 3) & "srt"
- srt.SaveToFile path, adSaveCreateOverWrite
- End Function
把上面代碼保存為ass2srt.vbs,然后將需要轉換的ass/ssa字幕拖動到ass2srt.vbs腳本上即可。如果需要批量轉換的ass/ssa字幕比較多,可以先把它們放到同一個文件夾里,然后直接雙擊運行ass2srt.vbs,選擇字幕所在的文件夾即可。
原文:http://demon.tw/my-work/ass2srt.html
新聞熱點
疑難解答
圖片精選