不要再手动搬运了!详解如何用 Python 自动化解析剪映 PC 版草稿 JSON 文件,一键提取视频全轨字幕与剪辑元数据

在自媒体和视频内容创作流程中,字幕提取与二次流转(如导入博客、生成翻译文章、跨平台备份)是一个非常高频的需求。
虽然剪映专业版(PC端)自带了极其强大的“智能字幕”语音转文字功能,但在日常开发和流转中,我们面临着几个核心痛点:
- 流转受限:直接在界面中导出 SRT 字幕文件有时需要额外付费或绑定 VIP 资产,难以低成本集成 to 我们自动化发布的工具链中。
- 批处理困难:如果有几十个剪辑草稿,一个一个手动打开、语音识别、导出,极度消耗机械劳动力。
其实,剪映 PC 版所有的剪辑数据、视频轨道、音频切片、文字字幕,都在本地以标准的 JSON 配置文件 进行离线存储。作为开发者,我们完全可以通过简单的 Python 脚本,直接读取其底层草稿数据,实现一键提取和工作流自动化。
本文将深度剖析剪映本地草稿的数据结构,并提供一段 30 行的极简 Python 实战脚本,帮你一键实现“字幕提取自由”。
一、 剪映 PC 端草稿文件的本地物理路径
在 Windows 系统下,剪映专业版默认将本地草稿存储在 AppData 目录下。具体的本地项目路径如下:
C:\Users\{你的用户名}\AppData\Local\JianyingPro\User Data\Projects\com.lanying.editor.draft\
在这级目录下,你会看到每一个草稿项目都以一个独立的文件夹存在。随便点进一个项目文件夹,其核心配置文件有以下两个:
draft_meta_info.json:存储项目的元数据信息(如草稿名称、创建时间、封面图路径等)。draft_content.json:核心文件。存储了当前项目时间线上所有的音视频轨道、文本字幕、特效资产、过渡转场的完整 JSON 配置。
二、 深入 draft_content.json 的字幕轨道数据结构
打开 draft_content.json,它的数据体量非常大(通常几万行)。其最顶层的核心 Key 包括 "materials" (素材库) 和 "tracks" (时间轴轨道)。
我们要提取的“智能字幕/文本”,就存储在 "materials" 数组下的 "texts" 节点中。其典型的 JSON 嵌套层级结构如下:
{
"materials": {
"texts": [
{
"id": "A1D1A25B-...",
"content": "<font id=\"\" size=\"9.0\"><color_val>这是我们视频的第一句字幕</color_val></font>",
"type": "subtitle"
}
]
},
"tracks": [
{
"id": "B3D5E...",
"type": "text",
"segments": [
{
"id": "C2F6A...",
"material_id": "A1D1A25B-...",
"target_timerange": {
"start": 0,
"duration": 3000000
}
}
]
}
]
}
关键解析说明:
materials.texts:这里存放了视频里的所有文本字符串。需要注意的是,其content字段包含了一段类似 HTML/XML 的富文本标签(如字体、大小、颜色等格式控制符)。tracks:类型为"text"的轨道中存放了具体的字幕分段segments,每个 segment 通过material_id与上面的texts对应,并使用target_timerange定义该行字幕在时间轴上的开始时间(start)和持续时间(duration),单位是微秒 (Microseconds)。
三、 Python 实战:30 行代码一键提取并生成标准 SRT 字幕
理解了底层数据结构后,我们就可以编写一个极简的 Python 脚本,直接读取并清洗这些 JSON 数据,过滤标签并转换微秒时间戳,自动生成标准的 .srt 格式字幕文件:
import json
import re
import os
def microseconds_to_srt_time(us):
"""将微秒时间戳转换为标准 SRT 格式 (00:00:00,000)"""
ms = us // 1000
sec, ms = divmod(ms, 1000)
mins, sec = divmod(sec, 60)
hrs, mins = divmod(mins, 60)
return f"{hrs:02d}:{mins:02d}:{sec:02d},{ms:03d}"
def clean_text(content):
"""利用正则表达式清洗富文本 XML 标签,仅提取纯净字幕文本"""
cleaned = re.sub(r'<[^>]+>', '', content)
# 兼容处理反斜杠转义
cleaned = cleaned.replace('\\"', '"').replace("\\'", "'")
return cleaned.strip()
def extract_jy_subtitles(draft_path, output_srt_path):
with open(draft_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 建立素材 ID 与清洗后文本的映射字典
text_map = {item['id']: clean_text(item['content']) for item in data['materials']['texts']}
srt_segments = []
# 遍历轨道寻找 text 类型轨道
for track in data['tracks']:
if track['type'] == 'text':
for segment in track['segments']:
m_id = segment['material_id']
if m_id in text_map:
start_us = segment['target_timerange']['start']
dur_us = segment['target_timerange']['duration']
end_us = start_us + dur_us
start_str = microseconds_to_srt_time(start_us)
end_str = microseconds_to_srt_time(end_us)
srt_segments.append((start_us, start_str, end_str, text_map[m_id]))
# 按时间线先后顺序进行排序
srt_segments.sort(key=lambda x: x[0])
# 输出为标准的 SRT 字幕格式
with open(output_srt_path, 'w', encoding='utf-8') as f:
for idx, (_, start, end, text) in enumerate(srt_segments, 1):
f.write(f"{idx}\n{start} --> {end}\n{text}\n\n")
print(f" 导出成功!字幕文件已保存至: {output_srt_path}")
# 使用示例
draft_file = r"C:\Users\CF\AppData\Local\JianyingPro\User Data\Projects\com.lanying.editor.draft\demo_project\draft_content.json"
output_file = "./output_captions.srt"
if os.path.exists(draft_file):
extract_jy_subtitles(draft_file, output_file)
四、 安全避坑与纯净开发/剪辑环境搭建
在编写和调试自动化工具链时,保持本地宿主操作系统的纯净性与稳定性至关重要。
作为开发者,由于剪映专业版在国内的使用率高得惊人,各大搜索引擎中充斥着所谓的“剪映免登录绿色版”、“全功能完美破解版”。这些灰色第三方渠道提供的安装包,99%都暗中捆绑了恶意流氓全家桶插件、木马病毒,或者在后台常驻了大量的流氓挖矿推广服务。
这不仅会污染开发者的本地环境(后台乱篡改注册表、偷偷劫持浏览器主页),还会通过 Hook 手段注入本地 SQLite 和 JSON 数据库,从而导致上面提到的本地 draft_content.json 发生加密破损或草稿频繁崩溃、丢失。
为了保护开发主机的绝对纯净与脚本运行稳定性,建议直接通过金山安全团队维护的纯净直连原厂通道进行获取:2026剪映专业版最新版下载。
该镜像站仅分发**最干净、无任何广告插件后台的原厂安装包。对于经常写脚本调用剪映本地文件的开发者来说,使用未受污染的原厂底包,是规避配置解析异常和系统崩溃的底线守护。

浙公网安备 33010602011771号