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字幕文件字幕偏移时间修改相关推荐

  1. linux日志文件怎么加时间,修改linux系统日志保存天数

    一.环境介绍 linux系统中/var/log/目录日志默认保存四周并不生成系统日志(syslog.log),当用户有规定保存多少天时才去进行修改.系统日志路径/var/log/目录下 二.修改方法 ...

  2. c/c++ 修改文件的创建时间,修改时间,访问时间 [和弦]

    一直想抽点时间将 c/c++ 系统的学学,毕竟c/c++有时候在会比较方便些,c#写多了,也想换换语言使使,开阔下视野,使自己看问题能更宏观些,做项目的时候也会有更多选择.于是就想记点笔记,以便复习, ...

  3. bat 批处理 批量调整 srt 字幕文件时间

    首先建立 Srt_time_one.bat 批处理文件, 用来调整 srt 字幕文件的总体时间,提前或滞后. @echo off title Srt_time_one_num CLS color 2i ...

  4. 字幕文件与视频文件对不上的处理方式

    阅读原文 序言 最近给自己的私人影院下了很多电影,会出现一种情况:很多字幕网站的字幕都是比较老的,字幕可以适配1080p(或者比较早)的视频,但是有部分2160p的视频的字幕很难找,经常下了一堆字幕, ...

  5. android str 字幕文件,视频显示字幕(解析srt文件)

    1.定义一个实体类 用于解析srt文件的内容 public class SRT { private int beginTime; private int endTime; private String ...

  6. HTML 修改时间日期,文件属性创建时间修改时间

    文件的创建时间.修改时间,访问时间是什么意思? 怎样把文件属性里的日期和修改时间改变 怎样把文件属性里的日期和修改时间改变 修改 属性里的 创建日期和 创建把文件属性里的日期和修改时间改变的具体操作步 ...

  7. python-视频声音根据语音识别自动转为带时间的srt字幕文件

    文章目录 问题 解决 截图 srt格式原理 识别语音的讯飞接口调用函数 处理结果,得到字符 列表合成字典 问题 讯飞文字转写长语音只有5h免费,想要体验50000分钟白嫖的,看我另一篇文章 最近在看一 ...

  8. 用Python从.srt或.vtt等格式的字幕文件中提取纯文字

    现在,很多视频网站都能方便地把字幕文件下载到电脑上,如果没有时间看视频,只看文字无疑是一种高效的学习方式.但是,如果直接读字幕文件却非常不舒服,因为字幕文件中有大量的时间标记和索引标记,如下图所示,这 ...

  9. html 字幕文件怎么打开,srt文件怎么打开

    srt是什么文件格式,用什么打开 srt文件即为字幕文件. srt文本字幕极为流行,因为其制作规范简单,一句时间代码加一句字幕,使得制作修改就相当简单.配合上.style文件还能让srt自带一些字体上 ...

  10. 批量提取 srt 字幕文件中的文字

    概要:相信经常与视频处理打交道的小伙伴对字幕文件一定不陌生.字幕文件一般来说会包含字幕序号.播放时间轴与具体的字幕内容,经常用于在视频播放的时候在对应的时间显示相应的字幕内容.字幕文件通常会有多种类型 ...

最新文章

  1. Python 之 Pandas (二)选择数据
  2. notepad++中的unexpected indent
  3. 记录输入框本地记录用户名效果
  4. php首页下雪源码代码,HTML5实现下雪效果的实例代码分享
  5. vue-property-decorator使用指南
  6. linux网络编程之字节序
  7. python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...
  8. hibernate数据类型_Hibernate类型初学者指南
  9. 爬虫-scrapy数据的持久化存储
  10. Milkyway database简析
  11. Oreilly的历史和公司概况
  12. html头像生成器,2020头像生成器
  13. yyyy-MM-dd 与 YYYY-MM-dd
  14. redhat linux 批量改名,CentOS的批量改名命令 rename和prename
  15. 第二章:互联网灵魂之TCP/IP(二)
  16. java dbcp c3p0_c3p0与dbcp的作用与区别,及使用!
  17. linux6.5修改网卡名称,Centos7更改网卡名为eth0
  18. 未来,区块链将在这些领域广泛应用
  19. 泛型接口的概述和使用
  20. 《重庆市新型基础设施重大项目建设行动方案(2020—2022年)》来啦!

热门文章

  1. 迈普交换机中断计算机网络,迈普3100交换机配置命令大全
  2. 程序员新电脑装机软件
  3. vs2017 社区版本离线下载安装包
  4. SECS/GEM介绍
  5. 使用prometheus+grafana监控k8s集群
  6. 硬件电路设计之电平转换芯片SN74LVC4245A
  7. 如何把视频kux格式转换mp4?手机怎么观看kux视频
  8. 【python】语句
  9. matlab 按文件名排序,文件名排序Matlab程序
  10. 操作系统原理,多道程序设计,并发环境与并发任务,进程定义,进程控制块PCB,PCB维护的进程数据