Skip to content

TCBOMC/Subtitle-Exporter

Repository files navigation

Subtitle-Exporter

快速批量导出字幕


环境准备

  • 安装ffmpeg:
    • 官网:https://ffmpeg.org/
    • 安装到Path(建议):下载并解压到任意目录后将包含ffmpeg.exe和ffprobe.exe的目录添加到Path
    • 安装到程序目录:下载并解压ffmpeg.exe和ffprobe.exe到本工具exe文件所在目录下的ffmpeg文件夹内(确保ffmpeg.exe和ffprobe.exe位于./ffmpeg/ffmpeg.exe和./ffmpeg/ffprobe.exe)
  • 安装spp2pgs:
    • 官网:https://github.com/subelf/Spp2Pgs/
    • 安装到Path(建议):下载并解压到任意目录后将包含spp2pgs.exe的目录添加到Path
    • 安装到程序目录:载并解压整个目录到本工具exe文件所在目录下的spp2pgs文件夹内(确保spp2pgs.exe位于./spp2pgs/spp2pgs.exe)
  • 安装FontForge:
    • 官网:https://fontforge.org/
    • 安装到Path:下载安装包并安装,将安装目录下的bin目录添加到Path
    • 安装到程序目录(建议):下载安装包并安装,将整个安装目录复制到本工具exe文件所在目录下的FontForge文件夹内(确保fontforge.exe位于./FontForge/bin/fontforge.exe),完成后为FontForge文件夹添加Everyone读写权限

使用程序

屏幕截图 2025-10-24 182616
  • 导入文件:
    • 使用左上角导入文件按钮打开文件选择窗口导入文件(支持批量导入)
    • 直接向窗口拖入(建议)文件(支持多选拖入)
  • 编辑信息:
    • 单击文件选中行(高亮的行)
    • 再次单机选中行的“宽度”,“高度”,“刷新率”列可对其中参数进行修改
    • 按住shiftctrl可多选行
    • 点击左上角删除按钮可删除选中的文件(高亮的行),点击清空按钮可清空全部文件
    • 点击文件第一列的复选框选中/取消选中文件(此处选中的文件为要导出字幕的文件)
    • 点击表头的复选框全选/全不选文件
  • 选择操作:
    • 格式下拉栏选择要导出的字幕格式,导出过程中如果遇到无法转换的字幕会尝试以原格式导出
    • 勾选清空头部将会清空ass或ssa字幕内[Script Info]的内参数(字幕仍可使用)
    • 右上角的下拉栏内选择对字体的处理方式
    • 点击提取字幕提取所有复选框被勾选的文件的字幕

字体处理

  • 封装字体:
    • 功能:将视频文件中封装的字体文件直接打包封装进字幕文件(ass/ssa)中,生成的字幕文件可在没安装字幕所需字体的系统中使用(需要播放器支持)。
    • 适用场景:
      1. 导出格式为 ASS 或 SSA
      2. 原视频中包含内封字体
      3. 希望免去安装字体的麻烦
      4. 希望在无法安装字体的平台上使用
      5. 字体中需注释字体名称对应关系,如:
      ; Font subset: L0V8T250 - M 盈黑 PRC W9
      ; Font subset: N1ZXC2NR - 华康翩翩体W5-A
      ; Font subset: 2YHL3UE1 - 汉仪正圆-75S
      ; Font subset: XQDHK75S - Arial
      ; Font subset: DYXAW90Z - 华康海报体W12
      ; Font subset: GSXJQ180 - 汉仪旗黑 80S
      ; Font subset: ZVUR2X0K - 内海フォント-Bold
      ; Font subset: GZNYNI7K - 汉仪正圆-65S
      ; Font subset: 8A905FBC - 汉仪正圆-55S
      ; Font subset: QL2VVX8J - 汉仪旗黑 55S
      ; Font subset: ZGLXT4XU - LINE Seed JP_OTF ExtraBold
      ; Font subset: QQ3SCN4Z - 851tegakizatsu
      
    • 实现流程:
      flowchart TD
      A(["开始提取字幕"]) --> B["处理所有选中视频"]
      C{"输出格式是否为ASS/SSA?"} -- 是 --> D["提取视频内封字体到临时目录"]
      C -- 否 --> E["不进行此操作"]
      B --> n1["提取当前视频信息"]
      n1 --> C
      D --> n2["提取视频内所有字幕并保存成功导出为ASS/SSA的字幕"]
      n2 --> n3["将所有字体以UUencode-like编码封装到每个保存的字幕里"]
      n3 --> n4["删除所有临时目录"]
      n4 --> n5["所有视频是否处理完成?"]
      n5 -- 是 --> n6(["完成操作"])
      n5 -- 否 --> n1
      n5@{ shape: diam}
      
      Loading
  • 子集合并:
    • 功能:从每个视频文件中提取所有字体,按照字幕注释中字体名称的对应关系对字体进行重命名(包括文件名,script name,family name),将字幕中的字体名按照注释中的对应关系从内封字体名还原成字体原本的名称,所有视频都提取完成后把所有视频提取出来的同名字幕的字符集合并后导出。
    • 使用场景:
      1. 导出格式为 ASS 或 SSA
      2. 原视频中包含内封字体
      3. 字体中需注释字体名称对应关系
      4. 不希望把字体封到字幕里但又不想找原版的字体或找不到
    • 实现流程:
      flowchart TD
      A(["开始提取字幕"]) --> B["处理所有选中视频"]
      C{"输出格式是否为ASS/SSA?"} -- 是 --> D["提取视频内所有字幕"]
      C -- 否 --> E["不进行此操作"]
      B --> n1["提取当前视频信息"]
      n1 --> C
      D --> n8["成功导出为ASS/SSA?"]
      n2["保存所有成功导出为ASS/SSA的字幕以及其对应字体映射"] --> n16["所有字幕是否导出完成?"]
      n3["导出字体"] --> n10["是否指定了保存目录?"]
      n5["所有视频是否处理完成?"] -- 是 --> n6["合并所有同名字体的字符集并保存所有合并后的字体"]
      n5 -- 否 --> n1
      n7["将字幕中的字体名按照注释中的对应关系从内封字体名还原成字体原本的名称"] --> n2
      n8 -- 是 --> n7
      n8 -- 否 --> n9["跳过此字幕"]
      n9 --> n16
      n10 -- 是 --> n11["保存到临时目录"]
      n10 -- 否 --> n12["保存到指定目录"]
      n11 --> n5
      n12 --> n5
      n6 --> n13["是否指定了保存目录?"]
      n13 -- 是 --> n14(["完成操作"])
      n13 -- 否 --> n15["选择导出字体目录"]
      n15 --> n14
      n16 --是--> n3
      n16 --否--> D
      n8@{ shape: diam}
      n16@{ shape: diam}
      n10@{ shape: diam}
      n5@{ shape: diam}
      n13@{ shape: diam}
      
      Loading
  • 字体名还原
    • 功能:将字幕中的字体名按照注释中的对应关系从内封字体名还原成字体原本的名称。
    • 场景:
      1. 导出格式为 ASS 或 SSA
      2. 字体中需注释字体名称对应关系
      3. 不希望以任何形式导出字体
    • 实现流程:
      flowchart TD
      A(["开始提取字幕"]) --> B["处理所有选中视频"]
      C{"输出格式是否为ASS/SSA?"} -- 是 --> D["提取视频内所有字幕"]
      C -- 否 --> E["不进行此操作"]
      B --> n1["提取当前视频信息"]
      n1 --> C
      D --> n8["成功导出为ASS/SSA?"]
      n5["所有视频是否处理完成?"] -- 否 --> n1
      n7["将字幕中的字体名按照注释中的对应关系从内封字体名还原成字体原本的名称"] --> n2["保存所有成功导出为ASS/SSA的字幕以及其对应字体映射"]
      n8 -- 是 --> n7
      n8 -- 否 --> n9["跳过此字幕"]
      n9 --> n15
      n2 --> n15@{ label: "<span style=\"color:\">所有字幕是否导出完成?</span>" }
      n5 --> n14(["完成操作"])
      n15 --是--> n5
      n15 --否--> D
      n8@{ shape: diam}
      n5@{ shape: diam}
      n15@{ shape: diam}
      
      Loading
  • 无处理:
    • 功能:跳过所有字体相关处理操作,输出原文件
    • 场景:不需要做处理或希望自行处理
  • 导出为sup字幕:
    • 功能:渲染并导出sup字幕
    • 场景:
      1. 不希望字幕被更改
      2. 希望字幕只要能播放就一定不会出问题,追求稳定
    • 实现流程:
      flowchart TD
      A(["开始提取字幕"]) --> B["处理所有选中视频"]
      C{"输出格式是否为SUP?"} -- 是 --> D@{ label: "<span style=\"color:\">提取视频内封字体到临时目录</span>" }
      C -- 否 --> E["不进行此操作"]
      B --> n1["提取当前视频信息"]
      n1 --> C
      D --> n19["提取视频内所有字幕"]
      n2["保存成功导出为ASS的字幕到临时目录以及其对应字体映射"] --> n3["将临时目录里的字体复制到用户字体文件夹并注册"]
      n3 --> n20["使用spp2pgs将导出的ass字幕渲染为sup字幕"]
      n5["所有视频是否处理完成?"] -- 否 --> n1
      n7["导出为ASS字幕"] --> n16["成功导出为ASS字幕?"]
      n8["成功复制为SUP?"] -- 否 --> n7
      n8 -- 是 --> n9["保存所有成功导出为sup的字幕"]
      n16 -- 是 --> n17["将字幕中的字体名按照注释中的对应关系从内封字体名还原成字体原本的名称"]
      n16 -- 否 --> n18["跳过此字幕"]
      n18 --> n22
      n17 --> n2
      n19 --> n8
      n20 --> n21["删除复制到临时目录的字体并取消注册"]
      n21 --> n9
      n9 --> n22@{ label: "<span style=\"color:\">所有字幕是否导出完成?</span>" }
      n5 -- 是 --> n14(["完成操作"])
      n22 --是--> n5
      n22 --否--> n19
      D@{ shape: rect}
      n5@{ shape: diam}
      n16@{ shape: diam}
      n8@{ shape: diam}
      n22@{ shape: diam}
      
      Loading

此项目使用AI辅助编程完成

About

快速批量导出字幕

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages