首页 > 编程知识 正文

autohotkey懒人包,ass文件字幕提取

时间:2023-05-03 18:43:02 阅读:276035 作者:3858

AutoHotKey脚本代码较为简单,几行代码可完成MFC较复杂的代码才能实现的界面和交互功能,虽然没有MFC强大,但对于普通的重复处理场景,应该也勉强够用了吧。参考自带的chm帮助文件可快速参考相应接口,简单向的技术日志,若有大佬愿意指点,请轻批

最近在看某部国外冷门电影,苦于电影没有字幕,看不懂,于是各种度娘搜索,最终终于找到了一个ass字幕文件,上播放器,结果字幕时间总是早于电影对白20秒。
由于不想每次打开播放器都要自己手动调整字幕同步时间,而且电脑上已经各种软件了,实在不想去装什么字幕编辑器,手动一个个改又要累死人,于是乎准备自己用AutoHotKey脚本DIY一个简单的ASS字幕时间偏移编辑器。
话不多说,动手开干,条件说明:

1. WINDOWS系统+已安装“AutoHotKey”工具+已安装“SciTE4AHK”编辑器; 2. 新建AutoHotKey Script文件,命名为“修改ASS字幕时间(v1.0).ahk”; 3. 编码步骤: (1) 添加界面代码: global Edit1_HWND, WM_CHAR := 0x102OnMessage(WM_CHAR, "OnChar")Gui, AssEdit:Add, GroupBox, Section w150, 偏移时间(±X.xx秒)Gui, AssEdit:Add, GroupBox, ys w339, 用法说明Gui, AssEdit:Add, Text, xp+10 yp+20 w200 cRed, 1.输入偏移时间;2.点击“开始”;3.打开字幕文件;4.保存字幕文件。Gui, AssEdit:Add, Edit, vTimeOffset Limit9 xs+10 ys+20 w80Gui, AssEdit:Add, Button, xs+100 ys+18 Default, 开始Gui, AssEdit:Add, ListView, xs w500 r20 NoSort, 序号|原始时间段|偏移时间|新的时间段Gui, AssEdit:Show, , ASS字幕时间修改GuiControlGet, Edit1_HWND, AssEdit:Hwnd, TimeOffset ; 获取编辑控件hwndreturnAssEditGuiEscape:AssEditGuiClose:ExitAppreturn

运行可出现如下界面:

(2) 添加时间戳转换函数:

因为目前遇到的ass字幕文件,时间格式是“H:MM:SS.xx”,所以代码仅支持“x:xx:xx.xx”格式的时间戳与毫秒的换算,如:“0:00:00.00”与“0”互转;“1:34:56.78”与“569678”互转。

HMMSS2MS(HMMSS) ; 1:34:56.78 ==> 1*3600*100 + 34*60*100 + 56*100 + 78 = 569678{return SubStr(HMMSS, 1, 1) * 3600 * 100 + SubStr(HMMSS, 3, 2) * 60 * 100 + SubStr(HMMSS, 6, 2) * 100 + SubStr(HMMSS, 9, 2)}MS2HMMSS(MS) ; 372408 ==> 1:02:04.08{H := Floor( MS / (3600 * 100) )MM := Floor( Mod(MS, 3600 * 100) / (60 * 100) )if(MM < 10)MM := "0" . MMSS := Floor( Mod(MS, 60 * 100) / 100 )if(SS < 10)SS := "0" . SSMS := Floor( Mod(MS, 100) )if(MS < 10)MS := "0" . MSreturn H . ":" . MM . ":" . SS . "." . MS} (3) 添加WM_CHAR消息函数“OnChar”:

用于在偏移时间编辑框中限制只能输入正号“+”、负号“-”、小数点“.”、数字0-9、退格键。

OnChar(wParam, lParam, Msg, Hwnd){if(hwnd <> Edit1_HWND){PostMessage, %Msg%, %wParam%, %lParam%, , ahk_id %Hwnd%return 0}if(Chr(wParam) = "+"or Chr(wParam) = "-"or Chr(wParam) = "."or (Chr(wParam) >= "0" and Chr(wParam) <= "9")or wParam = 8){PostMessage, %Msg%, %wParam%, %lParam%, , ahk_id %Hwnd%}return 0} (4) 添加[开始]按钮响应事件“AssEditButton开始”: AssEditButton开始:Gui, AssEdit:Submit, NoHideif(TimeOffset = "" or TimeOffset = 0){ToolTip, 请先设置偏移时间`n(单位:秒、≠0、可精确到小数点后2位)`n如:1.02Sleep, 1500ToolTipreturn}FileSelectFile, AssPath, 1, , 选择ASS字幕文件, ASS字幕文件(*.ass)if(ErrorLevel or AssPath = "")returnFileRead, AssContent, %AssPath%if(ErrorLevel or AssContent = "")returnHaystack := AssContentNeedleRegEx := "(?P<StartHMMSS>d{1}:d{2}:d{2}.d{2}),(?P<EndHMMSS>d{1}:d{2}:d{2}.d{2})"StartingPosition := 1AssContent := ""LV_Delete()Loop{FoundPos := RegExMatch(Haystack, NeedleRegEx, $, StartingPosition) ; 0:00:11.54if(ErrorLevel){MsgBox, , 提示, 匹配正则表达式失败!return}if(not FoundPos)break$NewStartHMMSS := MS2HMMSS( HMMSS2MS($StartHMMSS) + TimeOffset * 100 )$NewEndHMMSS := MS2HMMSS( HMMSS2MS($EndHMMSS) + TimeOffset * 100 )UnreplacedText := SubStr( Haystack, StartingPosition, FoundPos - StartingPosition )AssContent .= UnreplacedText . $NewStartHMMSS . "," . $NewEndHMMSSLV_Add(, A_Index, $StartHMMSS . "-" . $EndHMMSS, TimeOffset, $NewStartHMMSS . "-" . $NewEndHMMSS)StartingPosition := FoundPos + StrLen($StartHMMSS) + 1 + StrLen($EndHMMSS)}UnreplacedText := SubStr( Haystack, StartingPosition )AssContent .= UnreplacedTextLoop, % LV_GetCount("Column"){LV_ModifyCol(A_Index, "AutoHdr")}FileSelectFile, WriteAssPath, S24, , 保存ASS字幕文件, ASS字幕文件(*.ass)if(ErrorLevel or WriteAssPath = "")returnFileDelete, %WriteAssPath%FileAppend, %AssContent%, %WriteAssPath%, UTF-16return 4. 运行脚本: (1) 输入偏移时间 (2) 点击“开始”

(3) 打开字幕文件

(4) 保存字幕文件

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。