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

   2015-06-24 0
核心提示:这篇文章主要介绍了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)规范的脚本引擎的脚本。

上面的脚本文件同时包含了JScriptVBScript的代码。问题在于,有这个必要么?单纯用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

 
标签: ass ssa 批量转换 srt
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • React之 hook / class 结合typescript笔记
    React之 hook / class 结合typescript笔记
    使用 create-react-app 开启 TypeScriptCreate React App 是一个官方支持的创建 React 单页应用程序的CLI,它提供了一个零配置的现代构建设置。当你使用 Create React App 来创建一个新的 TypeScript React 工程时,你可以运行 npx create-react-app my-app
    03-08
  • dart系列之:dart类中的泛型 dart class
    目录简介为什么要用泛型怎么使用泛型类型擦除泛型的继承泛型方法总结简介熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念。什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合中,用来指定该集合中应该存储的对象格式。有了泛型可以简化我们的编程
    02-09
  • 微信小程序class封装http
    微信小程序class封装http
    config.jsvar config = {base_api_url:"https://douban.uieee.com/v2/"}export {config}utils/http.jsimport {config} from "../config";class HTTP{request(params) {if (!params.method) {params.method = "GET"}wx.request({url: config.ba
    02-09
  • 微信小程序(点击添元素加Class篇)
    微信小程序(点击添元素加Class篇)
    常用的记录一下说一下思路1、先给每个元素添加个id 和 状态2、通过点击 修改对应id 下的状态 从而添加样式效果图:  代码部分wxmlview class="label"view class="label-list {{item.isSelected ? 'active':''}}" wx:for="{{list}}" bindtap='itemSelected'
    02-09
  • 微信小程序之  Classify(商品属性分类)
    微信小程序之 Classify(商品属性分类)
    1.项目目录2.逻辑层broadcast.js// pages/broadcast/broadcast.jsPage({/** * 页面的初始数据 */data: {firstIndex: -1,//准备数据//数据结构:以一组一组来进行设定commodityAttr: [{priceId: 1,price: 35.0,"stock": 8,"attrValueList": [{"attrKey": "型号
    02-09
  • 基于腾讯云的 Rust 和 WebAssembly 函数即服务
    基于腾讯云的 Rust 和 WebAssembly 函数即服务
    腾讯云云函数 (SCF) 已经支持十多种编程语言和运行时框架。腾讯云最近发布的 SCF custom runtime(自定义运行时)更进一步 —— SCF 现在可以支持用任何编程语言编写的函数。本文将介绍如何在云函数 SCF 中运行用 Rust 编写的 WebAssembly 函数。我们先介绍一
    02-09
  • Delphi class of (类引用, 指向类信息的指针)
    类引用(TClassACls)就是类(TClassA)的类型,可以声明一个类引用变量(T)并赋给它一个子类(TClassB),可以通过这个变量创建对象的实例(T.Create)。unit Unit1;{* created by HouSoft* 2011/12/21* www.yryz.net}interfaceusesSysutils;type// 定义TCl
    02-09
  • Delphi7中插入汇编[Assembly]獲取CPUID
    Delphi7中插入汇编[Assembly]獲取CPUID
    unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TCPUID=array[1..4] of Longint;  TVendor=array [0..11] of char;type  TForm1 = class(TForm
    02-09
  • lua类库 middleclass学习笔记
    middleclass使在lua中面象对象变的简单抄了一遍他的示例代码运行着试了试,基本懂了local class = require 'middleclass'--类的继承Person = class('Person')--定义一个Person类function Person:initialize(name)--构造函数self.name = nameendfunction Perso
    02-09
  • Nginx+Lua系列:安装配置Nginx+Lua环境 nginx l
    安装环境安装步骤可以参考http://openresty.org/。1、创建目录/usr/servers,以后我们把所有软件安装在此目录mkdir -p /usr/serverscd /usr/servers/2、安装依赖(我的环境是ubuntu,可以使用如下命令安装,其他的可以参考openresty安装步骤)apt-get install
    02-09
点击排行