AutoHotKey完成ass字幕文件字幕偏移时间修改
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 w80
Gui, 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 ; 获取编辑控件hwnd
returnAssEditGuiEscape:
AssEditGuiClose:
ExitApp
return
运行可出现如下界面:
(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, NoHide
if(TimeOffset = "" or TimeOffset = 0)
{ToolTip, 请先设置偏移时间`n(单位:秒、≠0、可精确到小数点后2位)`n如:1.02Sleep, 1500ToolTipreturn
}
FileSelectFile, AssPath, 1, , 选择ASS字幕文件, ASS字幕文件(*.ass)
if(ErrorLevel or AssPath = "")return
FileRead, AssContent, %AssPath%
if(ErrorLevel or AssContent = "")return
Haystack := AssContent
NeedleRegEx := "(?P<StartHMMSS>\d{1}:\d{2}:\d{2}\.\d{2}),(?P<EndHMMSS>\d{1}:\d{2}:\d{2}\.\d{2})"
StartingPosition := 1
AssContent := ""
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 = "")return
FileDelete, %WriteAssPath%
FileAppend, %AssContent%, %WriteAssPath%, UTF-16
return
4. 运行脚本:
(1) 输入偏移时间
(2) 点击“开始”
(3) 打开字幕文件
(4) 保存字幕文件
AutoHotKey完成ass字幕文件字幕偏移时间修改相关推荐
- linux日志文件怎么加时间,修改linux系统日志保存天数
一.环境介绍 linux系统中/var/log/目录日志默认保存四周并不生成系统日志(syslog.log),当用户有规定保存多少天时才去进行修改.系统日志路径/var/log/目录下 二.修改方法 ...
- c/c++ 修改文件的创建时间,修改时间,访问时间 [和弦]
一直想抽点时间将 c/c++ 系统的学学,毕竟c/c++有时候在会比较方便些,c#写多了,也想换换语言使使,开阔下视野,使自己看问题能更宏观些,做项目的时候也会有更多选择.于是就想记点笔记,以便复习, ...
- bat 批处理 批量调整 srt 字幕文件时间
首先建立 Srt_time_one.bat 批处理文件, 用来调整 srt 字幕文件的总体时间,提前或滞后. @echo off title Srt_time_one_num CLS color 2i ...
- 字幕文件与视频文件对不上的处理方式
阅读原文 序言 最近给自己的私人影院下了很多电影,会出现一种情况:很多字幕网站的字幕都是比较老的,字幕可以适配1080p(或者比较早)的视频,但是有部分2160p的视频的字幕很难找,经常下了一堆字幕, ...
- android str 字幕文件,视频显示字幕(解析srt文件)
1.定义一个实体类 用于解析srt文件的内容 public class SRT { private int beginTime; private int endTime; private String ...
- HTML 修改时间日期,文件属性创建时间修改时间
文件的创建时间.修改时间,访问时间是什么意思? 怎样把文件属性里的日期和修改时间改变 怎样把文件属性里的日期和修改时间改变 修改 属性里的 创建日期和 创建把文件属性里的日期和修改时间改变的具体操作步 ...
- python-视频声音根据语音识别自动转为带时间的srt字幕文件
文章目录 问题 解决 截图 srt格式原理 识别语音的讯飞接口调用函数 处理结果,得到字符 列表合成字典 问题 讯飞文字转写长语音只有5h免费,想要体验50000分钟白嫖的,看我另一篇文章 最近在看一 ...
- 用Python从.srt或.vtt等格式的字幕文件中提取纯文字
现在,很多视频网站都能方便地把字幕文件下载到电脑上,如果没有时间看视频,只看文字无疑是一种高效的学习方式.但是,如果直接读字幕文件却非常不舒服,因为字幕文件中有大量的时间标记和索引标记,如下图所示,这 ...
- html 字幕文件怎么打开,srt文件怎么打开
srt是什么文件格式,用什么打开 srt文件即为字幕文件. srt文本字幕极为流行,因为其制作规范简单,一句时间代码加一句字幕,使得制作修改就相当简单.配合上.style文件还能让srt自带一些字体上 ...
- 批量提取 srt 字幕文件中的文字
概要:相信经常与视频处理打交道的小伙伴对字幕文件一定不陌生.字幕文件一般来说会包含字幕序号.播放时间轴与具体的字幕内容,经常用于在视频播放的时候在对应的时间显示相应的字幕内容.字幕文件通常会有多种类型 ...
最新文章
- Python 之 Pandas (二)选择数据
- notepad++中的unexpected indent
- 记录输入框本地记录用户名效果
- php首页下雪源码代码,HTML5实现下雪效果的实例代码分享
- vue-property-decorator使用指南
- linux网络编程之字节序
- python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...
- hibernate数据类型_Hibernate类型初学者指南
- 爬虫-scrapy数据的持久化存储
- Milkyway database简析
- Oreilly的历史和公司概况
- html头像生成器,2020头像生成器
- yyyy-MM-dd 与 YYYY-MM-dd
- redhat linux 批量改名,CentOS的批量改名命令 rename和prename
- 第二章:互联网灵魂之TCP/IP(二)
- java dbcp c3p0_c3p0与dbcp的作用与区别,及使用!
- linux6.5修改网卡名称,Centos7更改网卡名为eth0
- 未来,区块链将在这些领域广泛应用
- 泛型接口的概述和使用
- 《重庆市新型基础设施重大项目建设行动方案(2020—2022年)》来啦!