EDL文件处理:提取剪辑信息并计算时长追加至剪辑名
我来帮你搞定这个CMX-3600 EDL的处理问题!你的核心痛点是没法关联时码行和剪辑名行,同时时码转时长的计算也出了问题,下面是完整的解决方案,包含可直接运行的VBScript代码:
解决方案核心思路
- 跟踪行关联:逐行读取EDL时,用变量缓存上一行内容,当碰到
* FROM CLIP NAME:开头的行时,直接调用缓存的上一行时码 - 精准时码解析:用正则表达式提取时码的小时、分钟、秒、帧,按照25fps的规则转换为总帧数
- 时长计算与追加:通过前两组时码的帧差得到剪辑时长,转成标准时码格式后追加到剪辑名行末尾
- 安全输出:自动生成原文件名的
.txt后缀文件,完全避免覆盖原EDL
完整VBScript代码
Set fso = CreateObject("Scripting.FileSystemObject") Set reTimecode = New RegExp ' 匹配包含4组HH:MM:SS:FF格式时码的行 reTimecode.Pattern = "^(\d{2}:\d{2}:\d{2}:\d{2}) (\d{2}:\d{2}:\d{2}:\d{2}) (\d{2}:\d{2}:\d{2}:\d{2}) (\d{2}:\d{2}:\d{2}:\d{2})$" reTimecode.Global = False Set reClipName = New RegExp ' 匹配以* FROM CLIP NAME:开头的行 reClipName.Pattern = "^\* FROM CLIP NAME: (.+)$" reClipName.Global = False ' 检查是否传入了EDL文件路径 If WScript.Arguments.Count = 0 Then WScript.Echo "使用方式:" & vbCrLf & "1. 拖放EDL文件到本脚本上" & vbCrLf & "2. 命令行运行:cscript ProcessEDL.vbs ""你的EDL文件路径""" WScript.Quit 1 End If edlPath = WScript.Arguments(0) If Not fso.FileExists(edlPath) Then WScript.Echo "错误:找不到文件 " & edlPath WScript.Quit 1 End If ' 生成输出文件路径(原文件名+txt后缀) outputPath = fso.GetParentFolderName(edlPath) & "\" & fso.GetBaseName(edlPath) & ".txt" Set edlFile = fso.OpenTextFile(edlPath, 1) Set outputFile = fso.OpenTextFile(outputPath, 2, True) prevLine = "" ' 缓存上一行内容,用于关联时码和剪辑名 Do While Not edlFile.AtEndOfStream currentLine = Trim(edlFile.ReadLine) ' 检测当前行是否是剪辑名行 If reClipName.Test(currentLine) Then ' 检测上一行是否是合法时码行 If reTimecode.Test(prevLine) Then Set tcMatches = reTimecode.Execute(prevLine) ' 提取前两组时码(入点和出点) tcIn = tcMatches(0).SubMatches(0) tcOut = tcMatches(0).SubMatches(1) ' 转换为帧计数并计算时长 framesIn = TimecodeToFrames(tcIn) framesOut = TimecodeToFrames(tcOut) durationFrames = framesOut - framesIn durationTc = FramesToTimecode(durationFrames) ' 写入结果到输出文件 outputFile.WriteLine prevLine outputFile.WriteLine currentLine & " | 时长: " & durationTc & " (" & durationFrames & " 帧)" End If End If ' 更新缓存的上一行内容 prevLine = currentLine Loop edlFile.Close outputFile.Close WScript.Echo "处理完成!输出文件已保存到:" & outputPath ' 把HH:MM:SS:FF时码转换为总帧数(25fps) Function TimecodeToFrames(tc) Dim parts, h, m, s, f parts = Split(tc, ":") h = CInt(parts(0)) m = CInt(parts(1)) s = CInt(parts(2)) f = CInt(parts(3)) TimecodeToFrames = h * 3600 * 25 + m * 60 * 25 + s * 25 + f End Function ' 把总帧数转换回HH:MM:SS:FF格式(25fps) Function FramesToTimecode(frames) Dim h, m, s, f h = Int(frames / (3600 * 25)) frames = frames Mod (3600 * 25) m = Int(frames / (60 * 25)) frames = frames Mod (60 * 25) s = Int(frames / 25) f = frames Mod 25 FramesToTimecode = Right("0" & h, 2) & ":" & Right("0" & m, 2) & ":" & Right("0" & s, 2) & ":" & Right("0" & f, 2) End Function
关键代码解释
- 行关联逻辑:用
prevLine变量缓存每一行的内容,当检测到剪辑名行时,直接校验并使用缓存的上一行时码,完美解决了行关联的问题 - 正则匹配:两个正则表达式分别精准匹配时码行和剪辑名行,避免了误提取无关内容
- 时码转换函数:
TimecodeToFrames严格按照25fps规则计算总帧数(1小时=9000帧、1分钟=1500帧、1秒=25帧)FramesToTimecode把帧差转换回易读的时码格式,同时保留帧计数作为参考
- 安全输出:自动生成原文件名的
.txt文件,彻底避免覆盖原EDL文件的风险
使用步骤
- 把上面的代码复制到记事本,保存为
ProcessEDL.vbs - 直接拖放你的CMX-3600格式EDL文件到
ProcessEDL.vbs上,或者打开命令提示符运行:cscript ProcessEDL.vbs "你的EDL文件完整路径" - 处理完成后,同目录下会生成一个和原EDL同名的
.txt文件,里面就是你需要的内容
内容的提问来源于stack exchange,提问作者3pointedit
相关产品推荐
相关产品推荐

