如何在VBScript中将时码字符串转换为帧数并执行运算
处理EDL时码:拆分、帧数转换及差值计算
需求场景
我手头有这样的EDL格式时码字符串:
002 0000 A C 00:00:20:01 00:00:31:23 00:01:29:24 00:01:41:21
之前已经用VBScript正则捕获到了目标子匹配时码,现在需要完成这几件事:
- 把每个用
:分隔的时码拆成「小时、分钟、秒、帧数」的列表 - 按照25帧/秒的行业标准,将时码转换为总帧数
- 计算两个时码的时间差并格式化输出
时码转帧数规则(25fps标准)
- 小时转帧数:1小时 = 1 × 60 × (60 × 25) = 9000帧
- 分钟转帧数:1分钟 = 1 × (60 × 25) = 1500帧
- 秒转帧数:1秒 = 1 × 25帧
- 最后直接加上时码末尾的帧数部分
举个实际例子:时码00:02:20:01的转换计算:
0小时×9000 + 2分钟×1500 + 20秒×25 + 1帧 = 0 + 3000 + 500 + 1 = 3501帧
最终实现的VBScript代码
我最终完成了时码差值计算的完整脚本,核心是用DateDiff计算秒差,再用TimeSerial转换为标准时间格式;为了避免输出AM/PM后缀,特意把系统区域设置为德国(强制24小时制):
Option Explicit '将系统区域设置为德国,模拟24小时制(无AM/PM标识) setlocale "de-de" 'TBA读取整个数据文档以获取NameDetails和TC Dim TC '临时数据集,需将每一行传入此搜索 TC ="002 0000 A C 00:00:20:01 00:00:23:23 00:01:29:24 00:01:41:21" '定义每个时码元素的搜索条件 Dim re1 re1 =".*?" '非贪婪匹配填充内容 Dim re2 re2 ="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\s?(?:am|AM|pm|PM))?)" '时-分-秒-帧格式匹配 Dim re3 re3 =".*?" '非贪婪匹配填充内容 Dim re4 re4 ="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\s?(?:am|AM|pm|PM))?)" '时-分-秒-帧格式匹配 Dim re5 re5 =".*?" '非贪婪匹配填充内容 Dim re6 re6 ="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\s?(?:am|AM|pm|PM))?)" '时-分-秒-帧格式匹配 Dim re7 re7 =".*?" '非贪婪匹配填充内容 Dim re8 re8 ="((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\s?(?:am|AM|pm|PM))?)" '时-分-秒-帧格式匹配 '将时码搜索条件组合为搜索模式 Dim r Set r = New RegExp r.Pattern = re1+re2+re3+re4+re5+re6+re7+re8 r.IgnoreCase = True Dim m, timeDur, ts, Timeofday Set m = r.Execute(TC) '遍历时码以计算前两个条目之间的时长 If m.Item(0).SubMatches.Count > 0 Then Dim time1 time1=m.Item(0).SubMatches.Item(0) Dim time2 time2=m.Item(0).SubMatches.Item(1) Dim time3 time3=m.Item(0).SubMatches.Item(2) Dim time4 time4=m.Item(0).SubMatches.Item(3) '计算前两个时间的差值,单位为秒 timeDur=datediff("s", time1, time2) '将结果格式化为序列时间格式,例如00:00:00 ts = TimeSerial(0, 0, timeDur) '输出时长结果,后续需附加轨道信息并重复操作,然后保存到文件 MsgBox (ts) End If
代码关键说明
- 区域设置:通过
setlocale "de-de"强制启用24小时制,避免TimeSerial输出多余的AM/PM后缀 - 正则匹配:用组合的正则表达式一次性捕获EDL行内的4个目标时码
- 差值计算:用
DateDiff("s", time1, time2)快速计算两个时码的秒数差,再通过TimeSerial转换为易读的标准时间格式输出
内容的提问来源于stack exchange,提问作者3pointedit
相关产品推荐
相关产品推荐

