English | 中文
JyDraft 是一个用于 生成Jianying草稿(Draft)并基于草稿直接渲染导出视频 的工具集。 支持通过代码生成草稿文件,并使用独立工具在 无需安装剪映客户端 的情况下,将草稿及素材进行云端渲染并导出视频。
👉 可在右侧 Releases 页面下载已编译好的导出工具。
- 使用 C# 代码生成草稿(
draft_content.json) - 支持音频、视频、GIF、文本轨道与片段
- 支持转场、动画、字幕气泡、背景填充等效果
- ✅ 支持 加密草稿自动解密
- 支持 多草稿并发导出
- 无需安装剪映客户端
- 云端渲染,对本地机器性能要求低
下面示例展示了如何通过代码生成一个完整的草稿,并最终导出为 JSON 字符串。
var script = new ScriptFile(1920, 1080);
script.Content["id"] = draftId;
// 添加轨道
script
.AddTrack(TrackTypeName.audio)
.AddTrack(TrackTypeName.video)
.AddTrack(TrackTypeName.text);var assetDir = @"D:\pyJianYingDraft\readme_assets\tutorial";
var audioPath = Path.Combine(assetDir, "audio.mp3");
var audioMaterial = new AudioMaterial(audioPath);
var videoPath = Path.Combine(assetDir, "video.mp4");
var videoMaterial = new VideoMaterial(videoPath);
var gifPath = Path.Combine(assetDir, "sticker.gif");
var gifMaterial = new VideoMaterial(gifPath);var audioSegment = new AudioSegment(
audioMaterial,
TimeUtil.Trange(0, "5s"),
volume: 0.6f
);
audioSegment.AddFade("1s", 0);
var videoSegment = new VideoSegment(
videoMaterial,
TimeUtil.Trange(0, "4.2s")
);
videoSegment.AddAnimation(IntroType.斜切);
videoSegment.AddTransition(TransitionType.信号故障);
var gifSegment = new VideoSegment(
gifMaterial,
TimeUtil.Trange(videoSegment.End, gifMaterial.Duration)
);
gifSegment.AddBackgroundFilling("blur", 0.0625);var textSegment = new TextSegment(
"据说 JyDraft 效果还不错?",
videoSegment.TargetTimerange,
font: FontType.文轩体,
style: new TextStyle(color: new[] { 1.0f, 1.0f, 0.0f }),
clipSettings: new ClipSettings(transformY: -0.8f)
);
textSegment.AddAnimation(
Text_outro.故障闪动,
"out",
duration: TimeUtil.Tim("1s")
);
textSegment.AddBubble("361595", "6742029398926430728");script
.AddSegment(audioSegment)
.AddSegment(videoSegment)
.AddSegment(gifSegment)
.AddSegment(textSegment);
var json = script.Dumps();一个专业的 自动化视频渲染 API 服务, 支持通过 JSON 草稿文件 与 媒体素材 自动合成并生成视频, 适用于批量生成、自动化流水线和系统集成。
POST https://htwmedia.dpdns.org/auth/[email protected]
请求头:
X-App-Source: HDraft
请将
所有后续接口请求 必须在 Header 中携带:
X-API-KEY: <你的 API Key>
用于将 剪映 / CapCut 的加密草稿文件 解密为可读的 draft_content.json。
POST https://htwmedia.dpdns.org/home/DecryptDraft
POSTContent-Type: multipart/form-data
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| jsonFile | File | 是 | 剪映 / CapCut 加密草稿 JSON 文件 |
⚠️ 注意:
- 必须以文件上传形式提交
- 不是 URL 参数
- 不是 base64 字符串
{
"success": true,
"msg": "decrypt success",
"draft_content": "{...}"
}import requests
BASE_URL = "https://htwmedia.dpdns.org"
API_KEY = "your_api_key"
headers = {"X-API-KEY": API_KEY}
files = {"jsonFile": open("encrypted_draft.json", "rb")}
res = requests.post(
f"{BASE_URL}/home/DecryptDraft",
headers=headers,
files=files
)
data = res.json()
if data["success"]:
with open("draft_content.json", "w", encoding="utf-8") as f:
f.write(data["draft_content"])import requests, time
BASE_URL = "https://htwmedia.dpdns.org"
API_KEY = "your_api_key"
headers = {"X-API-KEY": API_KEY}
files = [
('jsonFile', open('draft.json','rb')),
('assets', open('video.mp4','rb'))
]
res = requests.post(
f"{BASE_URL}/home/UploadDraftPackage",
headers=headers,
data={'title':'示例'},
files=files
)
draft_id = res.json()['draftId']
task_id = requests.post(
f"{BASE_URL}/home/startrender",
params={'draftId': draft_id},
headers=headers
).json()['taskId']
while True:
status = requests.get(
f"{BASE_URL}/home/getstatus",
params={'taskId': task_id},
headers=headers
).json()
if status['status'] == 'completed':
print("下载地址:", status['downloadUrl'])
break
time.sleep(5)| 接口 | 方法 | 说明 |
|---|---|---|
| /auth/applykey | POST | 申请 API Key |
| /home/DecryptDraft | POST | 解密加密草稿 |
| /home/UploadDraftPackage | POST | 上传草稿与素材 |
| /home/startrender | POST | 启动渲染 |
| /home/getstatus | GET | 查询渲染进度 |
如果你对以下内容感兴趣:
- 剪映 / CapCut 草稿结构分析
- 草稿加密 / 解密原理
- 自动化渲染流程
- JyDraft 的二次开发与扩展
欢迎扫码加入 技术讨论群 👇
本群仅用于 技术交流与经验分享, 请勿发布广告或无关内容。
| 错误码 | 说明 |
|---|---|
| 401 | API Key 无效或缺失 |
| 400 | 参数错误 |
| 500 | 服务器内部错误 |
仅用于学习与技术研究,请勿用于任何违反剪映 / CapCut 用户协议或相关法律法规的用途。
