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/applykey?email=user@example.com
请求头:
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 用户协议或相关法律法规的用途。