当前位置:首页>python>Python批量处理SRT字幕:自动校准时间轴+格式转换

Python批量处理SRT字幕:自动校准时间轴+格式转换

  • 2026-10-11 05:45:21
Python批量处理SRT字幕:自动校准时间轴+格式转换

Python批量处理SRT字幕:自动校准时间轴+格式转换

✍️ 作者:研选信X
📌 本文为原创内容,未经授权禁止转载。如需合作请联系后台。

核心作用Core Purpose

做视频副业,最烦的不是剪辑,而是字幕时间轴对不上、格式乱糟糟。用Python写几个脚本,可以批量校准SRT时间轴(平移、缩放)、批量转ASS格式、提取中英双语字幕。一套脚本管一个项目,省去手动调时间的重复劳动。本文适合有视频副业或字幕翻译需求的人,代码拿来改改路径就能跑。

分步操作Step by Step

第一步:安装依赖

pip install pysubs2 python-dateutil

pysubs2 支持SRT/ASS/SSA/VTT等主流字幕格式互转,python-dateutil 处理时间计算。

第二步:批量校准时间轴(平移)

有些字幕是从别的视频提取的,时间轴对不上当前视频。用这个脚本批量平移:

from pysubs2 import SSAFile
import os

def shift_srt(input_dir, output_dir, shift_ms):
    os.makedirs(output_dir, exist_ok=True)
    for f in os.listdir(input_dir):
        if not f.endswith(".srt"):
            continue
        subs = SSAFile.load(os.path.join(input_dir, f))
        subs.shift(ms=shift_ms)  # 正值后移,负值前移
        subs.save(os.path.join(output_dir, f))
        print(f"已处理: {f}, 平移 {shift_ms}ms")

shift_srt("./raw_subs", "./shifted_subs", 2500)  # 后移2.5秒

shift_ms 参数:正值填入后移,负值填入前移,单位毫秒。

第三步:时间轴等比缩放

视频被加速/减速后,字幕时长需要同步缩放:

def scale_srt(input_dir, output_dir, scale_factor):
    os.makedirs(output_dir, exist_ok=True)
    for f in os.listdir(input_dir):
        if not f.endswith(".srt"):
            continue
        subs = SSAFile.load(os.path.join(input_dir, f))
        subs.scale(time_mult=scale_factor)  # 1.0=不变,0.95=加速5%
        subs.save(os.path.join(output_dir, f))
        print(f"已处理: {f}, 缩放 {scale_factor}x")

scale_srt("./raw_subs", "./scaled_subs", 0.95)

第四步:批量转ASS格式(支持特效)

SRT不支持字体颜色和位置,转ASS可以加样式:

def srt_to_ass(input_dir, output_dir):
    os.makedirs(output_dir, exist_ok=True)
    for f in os.listdir(input_dir):
        if not f.endswith(".srt"):
            continue
        subs = SSAFile.load(os.path.join(input_dir, f))
        subs.styles["Default"].fontname = "Arial"
        subs.styles["Default"].fontsize = 42
        subs.styles["Default"].primarycolor = "&H00FFFFFF"
        subs.save(os.path.join(output_dir, f.replace(".srt", ".ass")))
        print(f"已转换: {f} -> {f.replace('.srt', '.ass')}")

srt_to_ass("./shifted_subs", "./ass_output")

第五步:提取中英双语字幕(分离合并)

双语字幕一般是"中文\n英文"两行,用脚本拆开:

def split_bilingual(input_file, cn_out, en_out):
    with open(input_file, encoding="utf-8") as f:
        lines = f.readlines()

    cn_lines, en_lines = [], []
    buffer = []

    for line in lines:
        if line.strip().isdigit() or "-->" in line or line.strip() == "":
            if len(buffer) >= 2:
                cn_lines.append(buffer[0])
                en_lines.append(buffer[1])
                buffer = []
        else:
            buffer.append(line)

    with open(cn_out, "w", encoding="utf-8") as f:
        f.writelines(cn_lines)
    with open(en_out, "w", encoding="utf-8") as f:
        f.writelines(en_lines)

    print(f"已分离: {input_file} -> 中文+英文")

split_bilingual("bilingual.srt", "cn_only.srt", "en_only.srt")
常见坑点Common Pitfalls
坑点
现象
解决方案
中文乱码
生成的ASS打开乱码
脚本头部加 # -*- coding: utf-8 -*-,保存时指定 encoding="utf-8-sig"
时间轴溢出
负偏移后字幕出现在负时间
校准前先过滤:if event.start < 0: event.start = 0
批量处理漏文件
只处理了部分文件
加日志输出已处理文件名,对比原文件数量
缩放比例算错
加速视频1.1倍,时间轴缩放应为1/1.1=0.909
scale_factor = 原时长/新时长
,不要用反
快捷技巧Quick Tips

1. 批量重命名:字幕文件名乱七八糟?用 python -c "import os; [os.rename(f, f.replace(' ', '_')) for f in os.listdir('.') if f.endswith('.srt')]" 一键去空格

2. 批量合并同系列:同课程的多个SRT用 cat file1.srt file2.srt > combined.srt 合并,再用脚本重新生成序号

3. 时间戳快速校准:不确定该平移多少毫秒?先用一个文件试跑,用播放器边放边调参数,记录最佳偏移值后再批量

4. ASS加水印底栏:加一行字幕到底部作为来源标注:subs.insert(0, SSAEvent(start=0, end=1000, text="字幕由XXX整理"))

✍️ 作者:研选信X
📌 本文为原创内容,未经授权禁止转载。如需合作请联系后台。

最新文章

随机文章