Files
Popiai-skill/ai-editing/clip-export/SKILL.md
T

378 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: clip-export
display-name-zh: 剪映导出
summary-cn: 视频工程一键推送到剪映或CapCut草稿
summary-en: Push videos to JianYing or CapCut
description: |
视频工程推送工具。通过 Python 脚本程序化创建剪辑项目,一键推送到剪映或 CapCut。
直连模式直接在本机剪映/CapCut 草稿目录生成工程文件,打开软件即可编辑。
基于 pyJianYingDraft (PyPI) 封装。
触发词包括:剪映、CapCut、推送、推送到剪映、capcut、导出到剪映。
version: 3.0.4
tags: [Video, Export, JianYing, CapCut]
tags-cn: [视频, 导出, 剪映, CapCut]
exported-by: MiniMax-hub
---
# Clip Export - 视频工程推送工具
你是视频编辑 AI 助手。通过 Python 脚本程序化创建视频项目草稿,支持一键推送到剪映或 CapCut:
- **直连模式** (`direct=True`):直接在剪映/CapCut 草稿目录创建工程文件,打开软件即可预览编辑
## 支持的目标
| 目标 | 说明 |
|------|------|
| 中文版剪映 | `app_source: "lv"`, `app_id: 3704` |
| 国际版 CapCut | `app_source: "cc"`, `app_id: 359289` |
## 前置依赖
- Python 3.8+
- `pip3 install pyJianYingDraft`(已安装 v0.2.6
- **需要本机安装剪映或 CapCut**
## 输出模式
### 直连模式(推荐用于剪映/CapCut)
**CRITICAL — 区分中文版剪映和 CapCut 国际版:**
| 用户说 | 软件版本 | 草稿目录 |
|---|---|---|
| **"推送到剪映"** | 中文版剪映 | `~/Movies/JianyingPro/User Data/Projects/com.lveditor.draft/` |
| **"CapCut" / "capcut"** | 国际版 CapCut | `~/Movies/CapCut/User Data/Projects/com.lveditor.draft/` |
规则:
- 用户说 **"推送到剪映"** → 使用中文版剪映路径(`JianyingPro`
- 用户说 **"CapCut" / "capcut"** → 使用国际版路径(`CapCut`
- **如果没特别说明 → 必须询问用户**:想推送到中文版剪映还是国际版 CapCut?
当用户要在本机剪映/CapCut 中打开时,使用 `direct=True`。草稿直接创建到剪映草稿目录,无需手动导入。
```python
project = JyProject("我的视频", direct=True, overwrite=True)
# ... 添加素材 ...
project.save() # 直接出现在 CapCut 草稿列表中
```
- 自动探测剪映/CapCut 草稿目录(macOS / Windows
- 自动适配剪映或 CapCut 的格式和 platform 字段
## 核心 API
所有操作通过 `JyProject` 类完成。脚本路径:`.claude/skills/clip-export/scripts/jy_wrapper.py`
### 创建项目
```python
import sys, os
sys.path.insert(0, os.path.join(os.getcwd(), ".claude/skills/clip-export/scripts"))
from jy_wrapper import JyProject
# 直连模式:草稿直接出现在 CapCut 中(推荐)
project = JyProject("我的视频", direct=True, overwrite=True)
# 竖屏 1080x1920 + 直连
project = JyProject("竖屏视频", width=1080, height=1920, direct=True, overwrite=True)
# 打包模式:输出 zip(用于分发或其他软件)
project = JyProject("分发视频", overwrite=True)
```
### 添加视频
```python
# 基本导入
project.add_video("/absolute/path/video.mp4", start_time=0, duration="5s")
# 指定源起始位置(截取视频的第 10 秒开始的 5 秒)
project.add_video("/path/video.mp4", start_time="5s", duration="5s", source_start="10s")
# PiP 画中画(独立轨道 + 缩放)
from jy_wrapper import ClipSettings
pip_seg = project.add_video(
"/path/video.mp4",
start_time="1s", duration="4s",
track_name="PiP_Layer",
clip_settings=ClipSettings(scale_x=0.3, scale_y=0.3),
)
```
### 添加音频
```python
# BGM
project.add_audio("/path/bgm.mp3", start_time=0, volume=0.6, track_name="BGM")
# 配音
project.add_audio("/path/voice.wav", start_time="2s", duration="10s", track_name="Narration")
```
### 添加文字
```python
# 标题文字
project.add_text(
"大标题",
start_time="1s", duration="3s",
font_size=15.0,
color_rgb=(1.0, 0.8, 0.0), # 金色
transform_y=0.4, # 偏上
bold=True,
)
# 字幕(预设底部位置 transform_y=-0.8
project.add_subtitle("这是字幕", start_time="0s", duration="3s")
# 导入 SRT 字幕文件
project.import_srt("/path/to/subtitles.srt", track_name="字幕轨")
```
### 滤镜
```python
# 按名称添加(支持中英文 + 模糊匹配)
project.add_filter("VHS_III", start_time=0, duration="10s")
project.add_filter("复古电影感", start_time=0, duration="10s", intensity=80.0)
```
### 场景特效
```python
project.add_effect("CCD闪光", start_time="2s", duration="3s")
project.add_effect("抖动", start_time="5s", duration="2s")
```
### 关键帧动画
```python
from jy_wrapper import KeyframeProperty
# 先获取视频片段引用
seg = project.add_video("/path/video.mp4", start_time=0, duration="4s")
# 缩放动画:1.0 → 1.5
JyProject.add_keyframe(seg, "uniform_scale", "0s", 1.0)
JyProject.add_keyframe(seg, "uniform_scale", "4s", 1.5)
# 位移动画:从左到右
JyProject.add_keyframe(seg, "position_x", "0s", -0.5)
JyProject.add_keyframe(seg, "position_x", "4s", 0.5)
# 旋转
JyProject.add_keyframe(seg, "rotation", "0s", 0.0)
JyProject.add_keyframe(seg, "rotation", "4s", 360.0)
# 透明度渐变
JyProject.add_keyframe(seg, "alpha", "0s", 0.0)
JyProject.add_keyframe(seg, "alpha", "1s", 1.0)
```
可用属性:`position_x`, `position_y`, `rotation`, `scale_x`, `scale_y`, `uniform_scale`, `alpha`, `saturation`, `contrast`, `brightness`, `volume`
### 保存 & 导出
```python
# 直连模式 (direct=True 创建的项目)
project.save() # 自动创建到剪映/CapCut 草稿目录,打开软件即可看到
```
直连模式输出到草稿目录,刷新软件即可打开。
## 时间格式
所有时间参数支持多种格式:
| 格式 | 示例 | 说明 |
|------|------|------|
| 秒(float | `2.5` | 2.5 秒 |
| 微秒(int | `2500000` | 2.5 秒 |
| 带单位字符串 | `"3s"`, `"500ms"`, `"1m30s"` | 自动解析 |
| 冒号格式 | `"01:30"`, `"00:01:30"` | 分:秒 或 时:分:秒 |
## CLI 工具
### 资产搜索
```bash
# 搜索所有类别
python3 .claude/skills/clip-export/scripts/asset_search.py "复古"
# 限定分类搜索
python3 .claude/skills/clip-export/scripts/asset_search.py "淡化" -c transitions
# 列出资产概览
python3 .claude/skills/clip-export/scripts/asset_search.py --list
```
## 资产库
| 类别 | 数量 | 数据文件 |
|------|------|----------|
| 滤镜 (Filters) | 1052 | `data/filters.csv` |
| 转场 (Transitions) | 453 | `data/transitions.csv` |
| 场景特效 (Effects) | 1097 | `data/effects.csv` |
| 文字入场动画 (TextIntro) | 155 | `data/text_animations.csv` |
| 文字出场动画 (TextOutro) | 124 | `data/text_animations.csv` |
| 关键帧属性 | 11 | `data/keyframe_properties.csv` |
## 重要规则
1. **文件路径必须使用绝对路径**
2. **脚本结尾必须调用 `project.save()`**
3. **分辨率要匹配**:横屏 1920x1080(默认),竖屏需要显式指定 `width=1080, height=1920`
4. **不要猜测资产名称**:先用 `asset_search.py` 搜索确认
5. **关键帧时间是相对于片段起始的偏移量**,不是时间线绝对时间
6. **直连模式始终加 `overwrite=True`**:CapCut 打开草稿后会加密 JSON,重新生成必须覆盖
7. **用户要在剪映/CapCut 中打开 → 用直连模式**`direct=True`),其他软件 → 打包模式。区分版本:说"推送到剪映"→ 中文版;说"CapCut"→ 国际版
## CapCut 测试验证记录
以下用例已在 CapCut 8.4macOS)上实测通过:
| 测试 | 内容 | 结果 |
|------|------|------|
| 极简文字 | `add_text()` 仅文字,无媒体 | ✅ 正常打开 |
| 单视频 | `add_video()` 一个 15s mp4 | ✅ 正常显示,无媒体丢失 |
| 复杂混剪 | 7 段视频/图片 + BGM + 标题 + 字幕,33s | ✅ 正常打开,素材完整 |
**关键修复**(相比早期版本):
- `_copy_media_into_draft()` 将所有外部素材复制到 `Resources/` 目录内,解决 CapCut 沙盒导致的"媒体丢失"
- `_patch_for_capcut78()` 自动探测 CapCut 路径并注入正确的 `platform.app_source="cc"` + `app_id=359289`
- `_create_capcut_scaffold()` 创建 CapCut 所需的全部辅助文件(draft_agency_config / draft_biz_config / timeline_layout 等)
## 踩坑经验
### 1. duration 不能超过素材实际时长
`add_video()``source_start + duration` 不能超过源文件时长,否则抛出 `ValueError: 截取的素材时间范围超出了素材时长`
```python
# ✗ 错误:001.mp4 只有 1.5s,但 duration 设了 3s
p.add_video("001.mp4", duration="3s")
# ✓ 正确:先确认时长,不要超出
p.add_video("001.mp4", duration="1.5s")
```
**最佳实践**:先用 ffprobe 确认素材时长,duration 留出微小余量(如 `int(dur * 1_000_000)` 微秒精度),或省略 duration 让 wrapper 自动检测。
### 2. ffprobe 时长精度陷阱
ffprobe 返回的时长(如 `35.875011s`)和 pyJianYingDraft 内部计算的素材时长(`35875000μs`)可能有微秒级差异。当 `source_start + duration` 刚好等于 ffprobe 时长时,可能因四舍五入导致溢出。
```python
# ✗ 危险:ffprobe=35.875011s → 35875011μs,但素材时长=35875000μs
p.add_audio("long.mp4", duration=35.875011) # 超出 11μs → 报错
# ✓ 安全:显式指定稍短的时长
p.add_audio("long.mp4", duration="35.8s")
```
### 3. 图片可以当视频用
PNG/JPG 文件可以通过 `add_video()` 添加,duration 随意设(不受源文件时长限制)。非常适合做产品特写、静帧过渡。
```python
p.add_video("product.png", start_time="5s", duration="4s")
```
### 4. 视频文件当音频源
用视频文件做 BGM/音效时,wrapper 自动调用 ffmpeg 提取音频到 `.m4a`。直连模式下提取到草稿的 `audio/` 子目录,CapCut 能直接识别。
```python
# 自动提取音频轨,无需手动 ffmpeg
p.add_audio("video_with_music.mp4", volume=0.4, track_name="BGM")
```
### 5. CapCut 7.8 草稿加密
CapCut 打开草稿后会**加密** `draft_info.json`,导致:
- 无法再手动编辑草稿 JSON
- 重新生成同名草稿时必须 `overwrite=True` 覆盖
**迭代调试时**:每次修改后用新草稿名或 `overwrite=True`,避免在加密的 JSON 上操作。
### 6. 同一素材复用
同一个文件在时间线上出现多次时,只需多次调用 `add_video()` 用不同的 `source_start`wrapper 自动复用 material
```python
# 同一个 example.mp4,取不同片段
p.add_video("example.mp4", start_time="0s", duration="6s", source_start="0s")
p.add_video("example.mp4", start_time="11.5s", duration="7s", source_start="20s")
```
### 7. 混剪工程最佳模式
产品混剪 / 投放素材剪辑的推荐模板:
```python
p = JyProject("项目名", width=1080, height=1920, direct=True, overwrite=True)
# 1. 先铺视频轨(按时间线顺序)
p.add_video(...) # 开场
p.add_video(...) # 产品特写
p.add_video(...) # 高光片段
p.add_video(...) # 尾版
# 2. 加滤镜(全程覆盖)
p.add_filter("VHS_III", start_time=0, duration="总时长")
# 3. 加特效(转场处点缀)
p.add_effect("CCD闪光", start_time="转场时间点", duration="1.5s")
# 4. 加标题 + 字幕
p.add_text("标题", ...)
p.add_subtitle("字幕1", ...)
# 5. 加 BGM
p.add_audio("bgm.mp3", volume=0.4, track_name="BGM")
# 6. 保存
p.save()
```
## 典型工作流
1. 用户提供素材文件路径(视频/音频/图片)
2. 确认分辨率(横屏/竖屏)
3. **确认目标软件**
- 用户说 **"推送到剪映"** → 直连模式 + 中文版剪映路径(`JianyingPro`
- 用户说 **"CapCut" / "capcut"** → 直连模式 + 国际版路径(`CapCut`
- **未指定 → 必须询问用户**:想推送到中文版剪映还是国际版 CapCut?
4. 编写 Python 脚本创建草稿
5. 运行脚本
6. 用户在对应软件中查看
7. 根据反馈迭代修改
## 导入说明
### 剪映 / CapCut(直连模式)
直连模式自动探测路径。根据用户说的软件名称决定目标:
- **"推送到剪映"** → 中文版剪映路径(`JianyingPro`
- **"CapCut"** → 国际版路径(`CapCut`
- **未指定 → 必须询问用户**:想推送到中文版剪映还是国际版 CapCut?
**macOS 草稿目录:**
- 剪映: `~/Movies/JianyingPro/User Data/Projects/com.lveditor.draft/`
- CapCut: `~/Movies/CapCut/User Data/Projects/com.lveditor.draft/`
**Windows 草稿目录:**
- 剪映: `%LOCALAPPDATA%/JianyingPro/User Data/Projects/com.lveditor.draft/`
- CapCut: `%LOCALAPPDATA%/CapCut/User Data/Projects/com.lveditor.draft/`
## 完整示例
参见 `references/full_feature_showcase.py`
## 局限性
- 不能修改已有草稿(剪映/CapCut 打开后会加密 draft_info.json
- 不能访问 GPU 特效(智能抠图、美颜等)
- 直连模式需要本机安装剪映或 CapCutmacOS / Windows
- CapCut 打开草稿后会加密,重新生成需使用 `overwrite=True`