You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
关键代码解释
  1. 行关联逻辑:用prevLine变量缓存每一行的内容,当检测到剪辑名行时,直接校验并使用缓存的上一行时码,完美解决了行关联的问题
  2. 正则匹配:两个正则表达式分别精准匹配时码行和剪辑名行,避免了误提取无关内容
  3. 时码转换函数:
    • TimecodeToFrames严格按照25fps规则计算总帧数(1小时=9000帧、1分钟=1500帧、1秒=25帧)
    • FramesToTimecode把帧差转换回易读的时码格式,同时保留帧计数作为参考
  4. 安全输出:自动生成原文件名的.txt文件,彻底避免覆盖原EDL文件的风险
使用步骤
  1. 把上面的代码复制到记事本,保存为ProcessEDL.vbs
  2. 直接拖放你的CMX-3600格式EDL文件到ProcessEDL.vbs上,或者打开命令提示符运行:cscript ProcessEDL.vbs "你的EDL文件完整路径"
  3. 处理完成后,同目录下会生成一个和原EDL同名的.txt文件,里面就是你需要的内容

内容的提问来源于stack exchange,提问作者3pointedit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:39:30