pycapcut 0.0.1__tar.gz → 0.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pycapcut-0.0.2/PKG-INFO +88 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/README.md +148 -107
- pycapcut-0.0.2/pycapcut/__init__.py +70 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/animation.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/audio_segment.py +15 -15
- pycapcut-0.0.2/pycapcut/config.py +69 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/draft_folder.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/jianying_controller.py +16 -16
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/keyframe.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/local_materials.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/__init__.py +4 -5
- pycapcut-0.0.2/pycapcut/metadata/audio_scene_effect.py +761 -0
- pycapcut-0.0.2/pycapcut/metadata/filter_meta.py +1005 -0
- pycapcut-0.0.2/pycapcut/metadata/font_meta.py +359 -0
- pycapcut-0.0.2/pycapcut/metadata/text_intro.py +192 -0
- pycapcut-0.0.2/pycapcut/metadata/text_loop.py +91 -0
- pycapcut-0.0.2/pycapcut/metadata/text_outro.py +110 -0
- pycapcut-0.0.2/pycapcut/metadata/transition_meta.py +2284 -0
- pycapcut-0.0.2/pycapcut/metadata/video_character_effect.py +2041 -0
- pycapcut-0.0.2/pycapcut/metadata/video_group_animation.py +118 -0
- pycapcut-0.0.2/pycapcut/metadata/video_intro.py +261 -0
- pycapcut-0.0.2/pycapcut/metadata/video_outro.py +229 -0
- pycapcut-0.0.2/pycapcut/metadata/video_scene_effect.py +10832 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/script_file.py +6 -6
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/segment.py +1 -1
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/text_segment.py +10 -10
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/video_segment.py +6 -6
- pycapcut-0.0.2/pycapcut.egg-info/PKG-INFO +88 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/SOURCES.txt +1 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/setup.py +3 -3
- pycapcut-0.0.1/PKG-INFO +0 -77
- pycapcut-0.0.1/pycapcut/__init__.py +0 -276
- pycapcut-0.0.1/pycapcut/metadata/audio_scene_effect.py +0 -252
- pycapcut-0.0.1/pycapcut/metadata/filter_meta.py +0 -603
- pycapcut-0.0.1/pycapcut/metadata/font_meta.py +0 -341
- pycapcut-0.0.1/pycapcut/metadata/text_intro.py +0 -152
- pycapcut-0.0.1/pycapcut/metadata/text_loop.py +0 -105
- pycapcut-0.0.1/pycapcut/metadata/text_outro.py +0 -105
- pycapcut-0.0.1/pycapcut/metadata/transition_meta.py +0 -733
- pycapcut-0.0.1/pycapcut/metadata/video_character_effect.py +0 -1913
- pycapcut-0.0.1/pycapcut/metadata/video_group_animation.py +0 -131
- pycapcut-0.0.1/pycapcut/metadata/video_intro.py +0 -103
- pycapcut-0.0.1/pycapcut/metadata/video_outro.py +0 -80
- pycapcut-0.0.1/pycapcut/metadata/video_scene_effect.py +0 -7706
- pycapcut-0.0.1/pycapcut.egg-info/PKG-INFO +0 -77
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/assets/__init__.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/assets/draft_content_template.json +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/assets/draft_meta_info.json +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/effect_segment.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/exceptions.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/effect_meta.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/mask_meta.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/speech_to_song.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/tone_effect.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/template_mode.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/time_util.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/track.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/util.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/dependency_links.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/requires.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/top_level.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.2}/setup.cfg +0 -0
pycapcut-0.0.2/PKG-INFO
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: pycapcut
|
|
3
|
+
Version: 0.0.2
|
|
4
|
+
Summary: 轻量、灵活、易上手的Python CapCut草稿生成及导出工具,构建全自动化视频剪辑/混剪流水线
|
|
5
|
+
Home-page: https://github.com/GuanYixuan/pycapcut
|
|
6
|
+
Author: gary318
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Topic :: Multimedia :: Video
|
|
10
|
+
Requires-Python: >=3.8
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: pymediainfo
|
|
13
|
+
Requires-Dist: imageio
|
|
14
|
+
Requires-Dist: uiautomation>=2; sys_platform == "win32"
|
|
15
|
+
Dynamic: author
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-dist
|
|
21
|
+
Dynamic: requires-python
|
|
22
|
+
Dynamic: summary
|
|
23
|
+
|
|
24
|
+
## A lightweight, flexible, and easy-to-use Python tool for generating and exporting CapCut drafts to build fully automated video editing/remix pipelines!
|
|
25
|
+
|
|
26
|
+
> 🧪 This project is being migrated from [PyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft). Please ⭐️ to stay tuned!
|
|
27
|
+
|
|
28
|
+
> 📢 Join the [Discord server](https://discord.gg/WfHgGQvhyW) to discuss usage and new features
|
|
29
|
+
|
|
30
|
+
## Workflow
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
# Feature List
|
|
34
|
+
|
|
35
|
+
> ℹ Please refer to [Github Repository](https://github.com/GuanYixuan/pyCapCut/blob/main/english_readme.md) for full documentation.
|
|
36
|
+
|
|
37
|
+
### Template Mode
|
|
38
|
+
> 🧪 This module has just been migrated. If something doesn’t fit your template, please open an issue.
|
|
39
|
+
|
|
40
|
+
- ☑️ [Load](#load-template) an (unencrypted) `draft_content.json` file as a template
|
|
41
|
+
- ☑️ [Replace media for video/audio segments](#replace-media-by-name)
|
|
42
|
+
- ☑️ [Modify text contents of text segments](#replace-text-segment-content)
|
|
43
|
+
- ☑️ [Import entire audio/video/text tracks from a template draft into another draft](#import-tracks-from-a-template-draft)
|
|
44
|
+
- ☑️ [Extract resource metadata (stickers/bubbles/fancy text, etc.)](#extract-resource-metadata)
|
|
45
|
+
|
|
46
|
+
### Batch Export
|
|
47
|
+
> ⚠️ This module is being migrated. If interested, see the corresponding part in [PyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft?tab=readme-ov-file#%E6%89%B9%E9%87%8F%E5%AF%BC%E5%87%BA%E8%8D%89%E7%A8%BF)
|
|
48
|
+
|
|
49
|
+
- ☑️ Control CapCut to open a specific draft
|
|
50
|
+
- ☑️ Export a draft to a specific location
|
|
51
|
+
- ☑️ Adjust export resolution and frame rate
|
|
52
|
+
|
|
53
|
+
### Video and Image
|
|
54
|
+
> 🧪 This module has just been migrated. If animations/effects/transitions don’t take effect, please open an issue.
|
|
55
|
+
|
|
56
|
+
- ☑️ Add local video/image media, and [customize segment timing, duration, or playback speed](#source-trimming-and-global-speed)
|
|
57
|
+
- ☑️ [Global video adjustments](#global-video-adjustments) (rotation, scale, brightness, etc.) and [keyframe generation](#keyframes)
|
|
58
|
+
- ☑️ [In/Out/Group animations](#add-segment-animations) for video segments
|
|
59
|
+
- ☑️ Add [masks](#masks), [segment effects](#add-segment-effects), and [filters](#add-segment-filters)
|
|
60
|
+
- ☑️ Video background fill [(example code)](demo.py)
|
|
61
|
+
|
|
62
|
+
### Stickers
|
|
63
|
+
- ☑️ Add stickers based on metadata [extraction](#extract-resource-metadata)
|
|
64
|
+
- ☑️ [Keyframe](#keyframes) generation for stickers
|
|
65
|
+
|
|
66
|
+
### Audio
|
|
67
|
+
- ☑️ Add local audio media, and [customize segment timing, duration, or playback speed](#source-trimming-and-global-speed)
|
|
68
|
+
- ☑️ Adjust fade in/out durations [(example code)](demo.py), adjust volume [(example code)](demo.py), and its [keyframes](#keyframes)
|
|
69
|
+
- ☑️ Add [scene audio effects](#add-segment-effects) to audio segments and configure parameters
|
|
70
|
+
|
|
71
|
+
### Tracks
|
|
72
|
+
- ☑️ [Add tracks](#multi-track-operations) and [append segments to a specific track](#multi-track-operations)
|
|
73
|
+
- ☑️ Customize [layer ordering](#multi-track-operations) among video/filter/effect tracks
|
|
74
|
+
|
|
75
|
+
### Effects, Filters, and Transitions
|
|
76
|
+
- ☑️ Clip-attached [effects](#add-segment-effects), [filters](#add-segment-filters), and [animations](#add-segment-animations)
|
|
77
|
+
- ☑️ [Standalone tracks for effects and filters](#effect-and-filter-tracks)
|
|
78
|
+
- ☑️ Add transitions [(example code)](demo.py) and customize duration
|
|
79
|
+
|
|
80
|
+
### Text and Subtitles
|
|
81
|
+
- ☑️ [Add text, set fonts and styles](#add-text), modify [position and rotation](#global-video-adjustments) of text segments
|
|
82
|
+
- ☑️ [Keyframes](#keyframes) and [animations](#add-segment-animations) for text
|
|
83
|
+
- ☑️ Text stroke and text background
|
|
84
|
+
- ☑️ Text bubble effects and fancy text effects [(example code)](demo.py)
|
|
85
|
+
- ☑️ [Automatic line wrapping](#automatic-line-wrapping) with configurable max line width
|
|
86
|
+
- ☑️ [Import `.srt` files](#import-subtitles) to create subtitles in bulk and style them
|
|
87
|
+
|
|
88
|
+
> ℹ The [Github Repository](https://github.com/GuanYixuan/pyCapCut/blob/main/english_readme.md) contains a [demonstration of the above features](https://github.com/GuanYixuan/pyCapCut/blob/main/english_readme.md#quick-start).
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# pyCapCut
|
|
2
|
+
|
|
2
3
|
### 与[PyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft)同源的轻量、灵活、易上手Python CapCut草稿生成及导出工具,构建全自动视频剪辑/混剪流水线!
|
|
3
4
|
|
|
5
|
+
[English Version](english_readme.md)
|
|
6
|
+
|
|
4
7
|
> 🧪 本项目正在从[PyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft)进行迁移,欢迎⭐️此项目保持关注!
|
|
5
8
|
|
|
6
9
|
> 📢 欢迎加入[Discord服务器](https://discord.gg/WfHgGQvhyW)进行用法或新功能的讨论
|
|
@@ -11,6 +14,8 @@
|
|
|
11
14
|
# 功能清单
|
|
12
15
|
|
|
13
16
|
### 模板模式
|
|
17
|
+
> 🧪 本模块刚刚完成迁移,若出现不适配的情况欢迎提出issue
|
|
18
|
+
|
|
14
19
|
- ☑️ [加载](#加载模板)(未加密的)`draft_content.json`文件作为模板
|
|
15
20
|
- ☑️ [替换音视频片段的素材](#根据名称替换素材)
|
|
16
21
|
- ☑️ [修改文本片段的文本内容](#替换文本片段的内容)
|
|
@@ -20,12 +25,12 @@
|
|
|
20
25
|
### 批量导出
|
|
21
26
|
> ⚠️ 本模块正在迁移中,若有兴趣可参见[PyJianYingDraft中相应部分](https://github.com/GuanYixuan/pyJianYingDraft?tab=readme-ov-file#%E6%89%B9%E9%87%8F%E5%AF%BC%E5%87%BA%E8%8D%89%E7%A8%BF)
|
|
22
27
|
|
|
23
|
-
- ☑️
|
|
28
|
+
- ☑️ 控制CapCut打开指定草稿
|
|
24
29
|
- ☑️ [导出草稿至指定位置](#批量导出草稿)
|
|
25
30
|
- ☑️ 调节导出分辨率和帧率
|
|
26
31
|
|
|
27
32
|
### 视频与图片
|
|
28
|
-
>
|
|
33
|
+
> 🧪 本模块刚刚完成迁移,若有特效/动画/转场等不生效的情况欢迎提出issue
|
|
29
34
|
|
|
30
35
|
- ☑️ 添加本地视频/图片素材,并[自定义片段的时间、持续时长或播放速度](#素材截取与整体变速)
|
|
31
36
|
- ☑️ [视频整体调节](#视频整体调节)(旋转、缩放、亮度等)以及[关键帧生成](#关键帧)
|
|
@@ -55,17 +60,15 @@
|
|
|
55
60
|
- ☑️ [导入`.srt`文件](#导入字幕)生成字幕并批量设置格式
|
|
56
61
|
|
|
57
62
|
# 快速上手
|
|
58
|
-
例程`demo.py
|
|
63
|
+
例程`demo.py`将创建包含音视频素材和一行文本的CapCut草稿文件,并且添加了音频淡入、视频入场动画、转场效果、关键帧和文本气泡/花字。
|
|
59
64
|
|
|
60
65
|
这个例程的操作方法如下:
|
|
61
|
-
1.
|
|
66
|
+
1. 找到CapCut的**草稿文件夹路径**(类似`.../CapCut Drafts`),用其替换代码中的`<你的草稿文件夹>`
|
|
62
67
|
2. 运行`demo.py`
|
|
63
|
-
3.
|
|
68
|
+
3. 在CapCut中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启CapCut以刷新草稿列表),你应该看到类似如下的时间轴:
|
|
64
69
|
|
|
65
70
|

|
|
66
71
|
|
|
67
|
-
> ⚠️ 由于项目元数据正在迁移中,demo目前会出现“动画丢失”和“转场丢失”的情况,若对完整效果感兴趣可参见[PyJianYingDraft中的快速上手部分](https://github.com/GuanYixuan/pyJianYingDraft?tab=readme-ov-file#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B)
|
|
68
|
-
|
|
69
72
|
你可以仔细检查音频片段的音量设置、淡入效果时长等,看看是否符合上述代码的设置
|
|
70
73
|
|
|
71
74
|
# 用法文档
|
|
@@ -73,7 +76,9 @@
|
|
|
73
76
|
> ℹ 文档部分推荐从[功能清单](#功能清单)一节中选取感兴趣的功能阅读,而非直接按顺序阅读
|
|
74
77
|
|
|
75
78
|
### 模板模式
|
|
76
|
-
|
|
79
|
+
> 🧪 本模块刚刚完成迁移,若出现不适配的情况欢迎提出issue
|
|
80
|
+
|
|
81
|
+
为了保留部分复杂特性(文本特效、复合片段...),可以加载一个已有的CapCut草稿作为模板,然后将其中内容导入到另一的草稿中,或直接**替换其中部分片段的内容**。
|
|
77
82
|
|
|
78
83
|
目前提供了**三种替换功能**:
|
|
79
84
|
- [根据名称替换素材](#根据名称替换素材):直接替换素材本身,自然影响所有引用该素材的片段
|
|
@@ -82,17 +87,15 @@
|
|
|
82
87
|
|
|
83
88
|
除此之外,对于某些没有特定名称的特性(贴纸、花字等),提供了[提取素材元数据](#提取素材元数据)的功能以提取其`resource_id`
|
|
84
89
|
|
|
85
|
-
> ⚠️ 由于剪映6+版本对草稿文件进行了加密,故**暂不支持加载来自6+版本的草稿文件**作为模板
|
|
86
|
-
|
|
87
90
|
> ℹ 若出现模板内容丢失的情况,欢迎反馈
|
|
88
91
|
|
|
89
92
|
#### 加载模板
|
|
90
|
-
推荐使用`DraftFolder
|
|
93
|
+
推荐使用`DraftFolder`来管理CapCut的草稿文件夹(可以在CapCut的`全局设置`-`草稿位置`中查询),这样能够方便地根据已有模板生成新草稿。
|
|
91
94
|
|
|
92
95
|
```python
|
|
93
|
-
import
|
|
96
|
+
import pycapcut as cc
|
|
94
97
|
|
|
95
|
-
draft_folder =
|
|
98
|
+
draft_folder = cc.DraftFolder("<CapCut草稿文件夹>") # 一般形如 ".../CapCut Drafts"
|
|
96
99
|
script = draft_folder.duplicate_as_template("模板草稿", "新草稿") # 复制"模板草稿",并命名为"新草稿",同时打开新草稿供编辑
|
|
97
100
|
|
|
98
101
|
# 对返回的ScriptFile对象进行编辑,如替换素材、添加轨道、片段等
|
|
@@ -100,7 +103,7 @@ script = draft_folder.duplicate_as_template("模板草稿", "新草稿") # 复
|
|
|
100
103
|
script.save() # 保存你的"新草稿"
|
|
101
104
|
```
|
|
102
105
|
|
|
103
|
-
为了最大限度地兼容模板中的复杂特性,**导入的轨道与
|
|
106
|
+
为了最大限度地兼容模板中的复杂特性,**导入的轨道与pycapcut创建的轨道是分离开的**,具体地讲:
|
|
104
107
|
|
|
105
108
|
- 除下述替换功能外,不能在导入的轨道上添加片段、转场、淡入淡出、特效等
|
|
106
109
|
- **仍然可以创建新的轨道,并在其上添加片段等**,就像非模板模式一样
|
|
@@ -112,9 +115,9 @@ script.save() # 保存你的"新草稿"
|
|
|
112
115
|
`DraftFolder`也有相应的方法来提取指定草稿的素材元数据。
|
|
113
116
|
|
|
114
117
|
```python
|
|
115
|
-
import
|
|
118
|
+
import pycapcut as cc
|
|
116
119
|
|
|
117
|
-
draft_folder =
|
|
120
|
+
draft_folder = cc.DraftFolder("<CapCut草稿文件夹>")
|
|
118
121
|
draft_folder.inspect_material("草稿名称")
|
|
119
122
|
|
|
120
123
|
# 或者
|
|
@@ -147,7 +150,7 @@ script.inspect_material()
|
|
|
147
150
|
|
|
148
151
|
以[快速上手](#快速上手)中的草稿为例,假如我们希望换用新的音频素材,可以:
|
|
149
152
|
```python
|
|
150
|
-
new_material =
|
|
153
|
+
new_material = cc.AudioMaterial("<新的音频素材路径>")
|
|
151
154
|
script.replace_material_by_name("audio.mp3", new_material) # 替换名称为"audio.mp3"的素材
|
|
152
155
|
```
|
|
153
156
|
|
|
@@ -160,10 +163,10 @@ script.replace_material_by_name("audio.mp3", new_material) # 替换名称为"au
|
|
|
160
163
|
|
|
161
164
|
此过程分为两步:**选取轨道**和**替换素材**,以上方音频素材的替换为例:
|
|
162
165
|
```python
|
|
163
|
-
from
|
|
166
|
+
from pycapcut import trange, ShrinkMode, ExtendMode
|
|
164
167
|
|
|
165
168
|
audio_track = script.get_imported_track(
|
|
166
|
-
|
|
169
|
+
cc.TrackType.audio, # 选取导入的音频轨道
|
|
167
170
|
#name="audio", # 假如轨道有名称,最好利用名称来定位
|
|
168
171
|
index=0 # 也可用下标定位, 0表示最底层的同类型轨道
|
|
169
172
|
)
|
|
@@ -215,7 +218,7 @@ target_script = draft_folder.create_draft("新草稿", 1920, 1080) # 创建新
|
|
|
215
218
|
|
|
216
219
|
# 选取模板中的一个文本轨道
|
|
217
220
|
text_track = source_script.get_imported_track(
|
|
218
|
-
|
|
221
|
+
cc.TrackType.text, # 选取导入的文本轨道
|
|
219
222
|
#name="text", # 假如轨道有名称,最好利用名称来定位
|
|
220
223
|
index=0 # 也可用下标定位, 0表示最底层的同类型轨道
|
|
221
224
|
)
|
|
@@ -229,51 +232,10 @@ target_script.import_track(
|
|
|
229
232
|
)
|
|
230
233
|
```
|
|
231
234
|
|
|
232
|
-
### 批量导出草稿
|
|
233
|
-
作为整个自动化流程中的最后一步,本项目提供了基础的草稿批量导出功能。
|
|
234
|
-
|
|
235
|
-
> ⚠️ 剪映7+版本对控件进行了隐藏,故本功能目前**仅支持剪映6及以下版本**
|
|
236
|
-
|
|
237
|
-
> ⚠️ 本部分功能依赖于`uiautomation`库,故目前**仅支持在Windows系统下运行**
|
|
238
|
-
|
|
239
|
-
> ℹ 导出程序会将剪映窗口置顶,且需要控制光标进行点击,**建议在闲时/夜间运行**
|
|
240
|
-
|
|
241
|
-
> ℹ 本部分功能**在剪映专业版5.9和6.8中测试通过**
|
|
242
|
-
|
|
243
|
-
> ℹ 有用户反映部分Python版本(如3.13)下`uiautomation`会出现依赖问题, 推荐使用3.8、3.10或3.11, [详见此处](https://github.com/GuanYixuan/pyJianYingDraft/issues/12)
|
|
244
|
-
|
|
245
|
-
> ⚠️ 请**确认有导出草稿的相关权限(不使用VIP功能或已开通VIP)**, 否则可能陷入死循环
|
|
246
|
-
|
|
247
|
-
导出利用`JianyingController`类进行,具体用法如下:
|
|
248
|
-
|
|
249
|
-
```python
|
|
250
|
-
import pyJianYingDraft as draft
|
|
251
|
-
from pyJianYingDraft import ExportResolution, ExportFramerate
|
|
252
|
-
|
|
253
|
-
# 此前需要将剪映打开,并位于目录页
|
|
254
|
-
ctrl = draft.JianyingController()
|
|
255
|
-
|
|
256
|
-
# 然后即可导出指定名称的草稿, 注意导出结束后视频才会被剪切(重命名)至指定位置
|
|
257
|
-
ctrl.export_draft("要导出的草稿名称", "<导出路径>") # "导出路径"可以指向文件夹或直接指向文件
|
|
258
|
-
|
|
259
|
-
# 若希望调节分辨率或帧率, 可使用`resolution`和`framerate`参数
|
|
260
|
-
ctrl.export_draft("要导出的草稿名称", "<导出路径>",
|
|
261
|
-
resolution=ExportResolution.RES_1080P,
|
|
262
|
-
framerate=ExportFramerate.FR_24)
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
重复上述单次导出操作即可实现批量导出,类似如下代码:
|
|
266
|
-
```python
|
|
267
|
-
draft_names = ...
|
|
268
|
-
export_folder = ...
|
|
269
|
-
for name in draft_names:
|
|
270
|
-
ctrl.export_draft(name, os.path.join(export_folder, name, ".mp4"))
|
|
271
|
-
```
|
|
272
|
-
|
|
273
235
|
### 时间与轨道
|
|
274
236
|
|
|
275
237
|
#### 时间格式
|
|
276
|
-
|
|
238
|
+
**CapCut(和本项目)内部均采用微秒为单位保存时间**,但这不便于输入,故我们增加了一种“字符串形式”的时间,大部分时间参数均同时支持这两种形式:
|
|
277
239
|
- 微秒形式:用`int`表达,适于计算
|
|
278
240
|
- 字符串形式:用`str`表达,如`"1.5s"`、`"1h3m12s"`等,易于输入
|
|
279
241
|
|
|
@@ -283,17 +245,17 @@ for name in draft_names:
|
|
|
283
245
|
|
|
284
246
|
例如:
|
|
285
247
|
```python
|
|
286
|
-
import
|
|
287
|
-
from
|
|
248
|
+
import pycapcut as cc
|
|
249
|
+
from pycapcut import SEC, tim, trange
|
|
288
250
|
|
|
289
251
|
# 1秒钟
|
|
290
252
|
assert 1000000 == SEC == tim("1s") == tim("0.01666667m")
|
|
291
253
|
|
|
292
254
|
# 0~1分钟
|
|
293
|
-
assert
|
|
255
|
+
assert cc.Timerange(0, 60*SEC) == trange("0s", "1m") == trange("0s", "0.5m30s")
|
|
294
256
|
|
|
295
257
|
# 片段开始后2秒
|
|
296
|
-
seg:
|
|
258
|
+
seg: cc.VideoSegment
|
|
297
259
|
assert seg.target_timerange.start + 2*SEC == seg.target_timerange.start + tim("2s")
|
|
298
260
|
```
|
|
299
261
|
|
|
@@ -307,12 +269,12 @@ assert seg.target_timerange.start + 2*SEC == seg.target_timerange.start + tim("2
|
|
|
307
269
|
|
|
308
270
|
```python
|
|
309
271
|
import os
|
|
310
|
-
import
|
|
311
|
-
from
|
|
272
|
+
import pycapcut as cc
|
|
273
|
+
from pycapcut import trange, SEC
|
|
312
274
|
|
|
313
275
|
# 假定已有草稿文件script(参见“快速上手”),创建三个轨道
|
|
314
276
|
for i in range(3, 0, -1): # 倒序
|
|
315
|
-
script.add_track(
|
|
277
|
+
script.add_track(cc.TrackType.video, "%d" % i)
|
|
316
278
|
|
|
317
279
|
# 以下部分讲解素材与片段的创建
|
|
318
280
|
# 方式一:便捷构造(推荐)
|
|
@@ -320,27 +282,27 @@ tutorial_asset_dir = os.path.join(os.path.dirname(__file__), 'readme_assets', 't
|
|
|
320
282
|
video_path = os.path.join(tutorial_asset_dir, 'video.mp4')
|
|
321
283
|
|
|
322
284
|
# 直接传入素材路径
|
|
323
|
-
seg1 =
|
|
285
|
+
seg1 = cc.VideoSegment(video_path, trange("0s", "4s")) # 截取素材的前4秒
|
|
324
286
|
|
|
325
287
|
# 方式二:传统构造
|
|
326
|
-
mat =
|
|
327
|
-
seg2 =
|
|
288
|
+
mat = cc.VideoMaterial(video_path) # 先创建素材实例
|
|
289
|
+
seg2 = cc.VideoSegment(mat, trange("0s", "4s")) # 再传入片段构造函数
|
|
328
290
|
|
|
329
291
|
# 视频素材长度为 5s
|
|
330
292
|
print("Video material length: %f s" % (mat.duration / SEC))
|
|
331
293
|
|
|
332
294
|
# 以下部分讲解素材的时间截取与变速
|
|
333
295
|
# 不指定source_timerange,则自动从头截取素材等长片段
|
|
334
|
-
seg11 =
|
|
335
|
-
seg2 =
|
|
336
|
-
seg4 =
|
|
296
|
+
seg11 = cc.VideoSegment(video_path, trange("0s", "4s")) # 自动截取素材的前4秒(4s表示持续时长)
|
|
297
|
+
seg2 = cc.VideoSegment(video_path, trange("0s", "4s"), speed=1.25) # 自动截取素材的前4*1.25=5秒
|
|
298
|
+
seg4 = cc.VideoSegment(video_path, trange("0s", "3s"), speed=3.0) # 截取前3*3.0=9秒,素材不够长故报错
|
|
337
299
|
|
|
338
300
|
# 指定source_timerange,则截取素材的指定片段,自动设置速度
|
|
339
|
-
seg12 =
|
|
301
|
+
seg12 = cc.VideoSegment(video_path, trange("4s", "1s"),
|
|
340
302
|
source_timerange=trange(0, "4s")) # 将素材在1s内放完,速度自动设置为5.0
|
|
341
303
|
|
|
342
304
|
# 同时指定source_timerange和speed,则截取素材的指定片段,并根据播放速度覆盖target_timerange的duration
|
|
343
|
-
seg3 =
|
|
305
|
+
seg3 = cc.VideoSegment(video_path, trange("1s", "66666h"),
|
|
344
306
|
source_timerange=trange(0, "5s"),
|
|
345
307
|
speed=2.0) # 将长5s的素材按2倍速放完,target_timerange的duration自动设为2.5s
|
|
346
308
|
|
|
@@ -348,18 +310,15 @@ seg3 = draft.VideoSegment(video_path, trange("1s", "66666h"),
|
|
|
348
310
|
script.add_segment(seg11, "1").add_segment(seg12, "1")
|
|
349
311
|
script.add_segment(seg2, "2")
|
|
350
312
|
script.add_segment(seg3, "3")
|
|
351
|
-
|
|
352
|
-
# 保存草稿
|
|
353
|
-
script.dump("*你的草稿工程文件夹*/draft_content.json")
|
|
354
313
|
```
|
|
355
314
|
|
|
356
315
|
#### 多轨道操作
|
|
357
316
|
目前`ScriptFile.add_track`方法已支持创建多个同类型轨道,并支持自定义其顺序:
|
|
358
317
|
```python
|
|
359
|
-
script.add_track(
|
|
318
|
+
script.add_track(cc.TrackType.video,
|
|
360
319
|
track_name="前景", # 轨道名
|
|
361
320
|
relative_index=2) # 在所有视频轨道中的相对位置
|
|
362
|
-
script.add_track(
|
|
321
|
+
script.add_track(cc.TrackType.video,
|
|
363
322
|
track_name="背景",
|
|
364
323
|
relative_index=1) # 由于1<2,所以前景轨道位于更上方
|
|
365
324
|
```
|
|
@@ -377,9 +336,9 @@ script.add_segment(video_segment, "背景")
|
|
|
377
336
|
|
|
378
337
|
下方的例子将创建一个视频片段,并设置其不透明度为0.5、打开水平翻转:
|
|
379
338
|
```python
|
|
380
|
-
from
|
|
381
|
-
video_segment =
|
|
382
|
-
|
|
339
|
+
from pycapcut import ClipSettings
|
|
340
|
+
video_segment = cc.VideoSegment(video_material,
|
|
341
|
+
cc.Timerange(0, video_material.duration), # 与素材等长
|
|
383
342
|
clip_settings=ClipSettings(alpha=0.5, # 不透明度为0.5
|
|
384
343
|
flip_horizontal=True) # 打开水平翻转
|
|
385
344
|
)
|
|
@@ -394,17 +353,17 @@ video_segment = draft.VideoSegment(video_material,
|
|
|
394
353
|
下方的例子尝试使用两个不透明度关键帧模拟视频的淡出效果:
|
|
395
354
|
```python
|
|
396
355
|
import os
|
|
397
|
-
import
|
|
398
|
-
from
|
|
356
|
+
import pycapcut as cc
|
|
357
|
+
from pycapcut import KeyframeProperty, SEC
|
|
399
358
|
|
|
400
359
|
# 假定已有草稿文件script(参见“快速上手”),创建视频轨道
|
|
401
|
-
script.add_track(
|
|
360
|
+
script.add_track(cc.TrackType.video)
|
|
402
361
|
tutorial_asset_dir = os.path.join(os.path.dirname(__file__), 'readme_assets', 'tutorial')
|
|
403
362
|
|
|
404
363
|
# 创建视频片段
|
|
405
|
-
video_material =
|
|
406
|
-
video_segment =
|
|
407
|
-
|
|
364
|
+
video_material = cc.VideoMaterial(os.path.join(tutorial_asset_dir, 'video.mp4'))
|
|
365
|
+
video_segment = cc.VideoSegment(video_material,
|
|
366
|
+
cc.Timerange(0, video_material.duration)) # 与素材等长
|
|
408
367
|
|
|
409
368
|
# 添加两个不透明度关键帧形成1s的淡出效果
|
|
410
369
|
video_segment.add_keyframe(KeyframeProperty.alpha, video_segment.duration - SEC, 1.0) # 结束前1s完全不透明
|
|
@@ -412,9 +371,6 @@ video_segment.add_keyframe(KeyframeProperty.alpha, video_segment.duration, 0.0)
|
|
|
412
371
|
|
|
413
372
|
# 添加片段到轨道
|
|
414
373
|
script.add_segment(video_segment)
|
|
415
|
-
|
|
416
|
-
# 保存草稿
|
|
417
|
-
script.dump("*你的草稿工程文件夹*/draft_content.json")
|
|
418
374
|
```
|
|
419
375
|
|
|
420
376
|
除了`alpha`外,`KeyframeProperty`中还有平移、旋转、缩放、音量、饱和度等属性,它们都可以设置关键帧。
|
|
@@ -422,14 +378,14 @@ script.dump("*你的草稿工程文件夹*/draft_content.json")
|
|
|
422
378
|
|
|
423
379
|
对音频片段,目前只能设置音量的关键帧,此时你不需要指定`KeyframeProperty`
|
|
424
380
|
```python
|
|
425
|
-
audio_segment:
|
|
381
|
+
audio_segment: cc.AudioSegment
|
|
426
382
|
audio_segment.add_keyframe("0s", 0.6) # 片段开始时的音量为60%
|
|
427
383
|
```
|
|
428
384
|
|
|
429
385
|
### 蒙版
|
|
430
386
|
蒙版的添加非常简单:调用`VideoSegment`的`add_mask`方法即可:
|
|
431
387
|
```python
|
|
432
|
-
from
|
|
388
|
+
from pycapcut import MaskType
|
|
433
389
|
|
|
434
390
|
# 添加一个线性蒙版,中心点在素材的(100, 0)像素处,顺时针旋转45度
|
|
435
391
|
video_segment1.add_mask(MaskType.线性, center_x=100, rotation=45)
|
|
@@ -437,13 +393,98 @@ video_segment1.add_mask(MaskType.线性, center_x=100, rotation=45)
|
|
|
437
393
|
video_segment2.add_mask(MaskType.圆形, size=0.5)
|
|
438
394
|
```
|
|
439
395
|
其中:
|
|
440
|
-
- `MaskType
|
|
441
|
-
- `center_x`和`center_y
|
|
442
|
-
- `rotation`、`feather`、`round_corner
|
|
396
|
+
- `MaskType`保存了CapCut自带的蒙版类型
|
|
397
|
+
- `center_x`和`center_y`参数表示蒙版中心点的坐标,与CapCut中意义一致
|
|
398
|
+
- `rotation`、`feather`、`round_corner`分别表示旋转、羽化、圆角参数,与CapCut中意义一致
|
|
443
399
|
- `size`参数表示蒙版的“主要尺寸”(镜面的可视部分高度/圆形直径/爱心高度等)占素材的比例
|
|
444
400
|
|
|
445
401
|
更具体的参数说明请参见`add_mask`方法的注释。
|
|
446
402
|
|
|
403
|
+
### 特效、动画和滤镜
|
|
404
|
+
#### 特效类型
|
|
405
|
+
目前支持的**特效**类型由以下枚举类定义:
|
|
406
|
+
- 音频:`AudioSceneEffectType`(场景音)
|
|
407
|
+
- 视频:`VideoSceneEffectType`(画面特效)、`VideoCharacterEffectType`(人物特效)
|
|
408
|
+
|
|
409
|
+
目前支持的**动画**类型由以下枚举类定义:
|
|
410
|
+
- 视频:`IntroType`(入场), `OutroType`(出场), `GroupAnimationType`(组合动画)
|
|
411
|
+
- 文本:`TextIntro`(入场)、`TextOutro`(出场), `TextLoopAnim`(循环动画)
|
|
412
|
+
|
|
413
|
+
**滤镜**类型则保存在`FilterType`中,仅对视频片段有效。
|
|
414
|
+
|
|
415
|
+
上述枚举类中的成员(通常)直接**以特效或滤镜的名字命名**,并注释了相应参数,例如:
|
|
416
|
+
|
|
417
|
+

|
|
418
|
+
|
|
419
|
+
你也可以使用`from_name`方法来获取特定的成员,其忽略大小写、空格和下划线,例如:
|
|
420
|
+
|
|
421
|
+
```python
|
|
422
|
+
assert VideoSceneEffectType.from_name("__全息 扫描__") == VideoSceneEffectType.全息扫描
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
> ⚠️ 并非所有在枚举类中的特效均可用,**请确认能在CapCut窗口中找到该特效再使用**
|
|
426
|
+
|
|
427
|
+
#### 添加片段特效
|
|
428
|
+
添加特效使用的方法是`segment.add_effect()`,它接受特效类型和一个参数数组,参数数组的顺序**与特效类型注释中的参数顺序一致**,但**不一定与CapCut内的参数顺序一致**。
|
|
429
|
+
|
|
430
|
+
下方的例子为视频片段添加一个`全息扫描`特效,并且指定其`氛围`参数为(CapCut中的)100,其余参数默认:
|
|
431
|
+
```python
|
|
432
|
+
from pyJianYingDraft import VideoSceneEffectType
|
|
433
|
+
|
|
434
|
+
video_segment.add_effect(VideoSceneEffectType.全息扫描,
|
|
435
|
+
[None, None, 100.0]) # 不设置前两个参数, 第三个参数(氛围)为100,其余参数也不设置
|
|
436
|
+
```
|
|
437
|
+
音频片段的特效添加方法与视频片段相似
|
|
438
|
+
|
|
439
|
+
#### 添加片段滤镜
|
|
440
|
+
滤镜的添加方法与特效类似,其使用的是`VideoSegment.add_filter()`方法。
|
|
441
|
+
与特效不同的是,滤镜只支持一个“滤镜强度”参数。
|
|
442
|
+
|
|
443
|
+
```python
|
|
444
|
+
from pyJianYingDraft import FilterType
|
|
445
|
+
|
|
446
|
+
video_segment1.add_filter(FilterType.原生肤, 10) # 设置"原生肤"强度为10
|
|
447
|
+
video_segment2.add_filter(FilterType.冰雪世界, 50) # 设置"冰雪世界"强度为50
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
#### 独立轨道上的特效和滤镜
|
|
451
|
+
除了为视频片段添加特效和滤镜外,你还可以创建独立的特效轨道和滤镜轨道,并在其上添加特效和滤镜片段。
|
|
452
|
+
|
|
453
|
+
首先使用`ScriptFile.add_track()`方法创建特效轨道或滤镜轨道。若需要指定顺序请参考[多轨道操作](#多轨道操作)
|
|
454
|
+
```python
|
|
455
|
+
script.add_track(draft.TrackType.effect, "my_effect") # 创建名为"my_effect"的特效轨道
|
|
456
|
+
script.add_track(draft.TrackType.filter, "my_filter") # 创建名为"my_filter"的滤镜轨道
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
接下来便可使用`add_effect`和`add_filter`方法向这些轨道添加片段:
|
|
460
|
+
```python
|
|
461
|
+
from pyJianYingDraft import VideoSceneEffectType, FilterType, trange
|
|
462
|
+
|
|
463
|
+
# 在特效轨道上添加一个"胶片闪切"特效,持续5秒,并设置其参数
|
|
464
|
+
script.add_effect(VideoSceneEffectType.胶片闪切, trange("0s", "5s"),
|
|
465
|
+
track_name="my_effect", # 当特效轨道只有一条时可省略
|
|
466
|
+
params=[50, None, 80]) # 设置速度为50,保持强度默认(100),设置纹理为80
|
|
467
|
+
|
|
468
|
+
# 在滤镜轨道上添加一个"哈苏蓝"滤镜,持续整个视频,强度为70
|
|
469
|
+
script.add_filter(FilterType.冷蓝, trange(0, script.duration),
|
|
470
|
+
track_name="my_filter", # 当滤镜轨道只有一条时可省略
|
|
471
|
+
intensity=70)
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
#### 添加片段动画
|
|
475
|
+
添加动画使用的方法是`segment.add_animation()`,其仅接收一个动画类型作为参数,动画的持续时间由其默认值决定。若需要添加多个动画,可对同一个片段调用多次该方法。
|
|
476
|
+
|
|
477
|
+
> ℹ 为**文本片段**同时设置循环动画和入出场动画时, 请**先添加出入场动画再添加循环动画**
|
|
478
|
+
|
|
479
|
+
以下是为一个文本片段添加三种动画的例子:
|
|
480
|
+
```python
|
|
481
|
+
from pyJianYingDraft import TextIntro, TextOutro, TextLoopAnim
|
|
482
|
+
|
|
483
|
+
text_seg.add_animation(TextIntro.复古打字机).add_animation(TextOutro.弹簧)
|
|
484
|
+
text_seg.add_animation(TextLoopAnim.色差故障) # 注意:循环动画必须在出入场动画之后添加
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
|
|
447
488
|
### 文本及字幕
|
|
448
489
|
#### 添加文本
|
|
449
490
|
添加文本与添加视频/音频片段类似,只需创建`TextSegment`对象并利用`add_segment`添加到`ScriptFile`中即可。
|
|
@@ -451,11 +492,11 @@ video_segment2.add_mask(MaskType.圆形, size=0.5)
|
|
|
451
492
|
|
|
452
493
|
例如:
|
|
453
494
|
```python
|
|
454
|
-
import
|
|
455
|
-
from
|
|
495
|
+
import pycapcut as cc
|
|
496
|
+
from pycapcut import FontType, TextStyle, ClipSettings
|
|
456
497
|
|
|
457
498
|
# 带下划线、位置及大小类似字幕的浅蓝色文本
|
|
458
|
-
seg1 =
|
|
499
|
+
seg1 = cc.TextSegment("Subtitle", trange("0s", "10s"),
|
|
459
500
|
font=FontType.文轩体,
|
|
460
501
|
style=TextStyle(size=5.0, color=(0.7, 0.7, 1.0), underline=True, align=1),
|
|
461
502
|
clip_settings=ClipSettings(transform_y=-0.8))
|
|
@@ -468,7 +509,7 @@ seg1 = draft.TextSegment("Subtitle", trange("0s", "10s"),
|
|
|
468
509
|
|
|
469
510
|
```python
|
|
470
511
|
# 启用自动换行,设置最大行宽为屏幕宽度的70%
|
|
471
|
-
seg2 =
|
|
512
|
+
seg2 = cc.TextSegment("这是一段很长的文本内容,当超过设定的最大行宽时会自动换行显示",
|
|
472
513
|
trange("0s", "10s"),
|
|
473
514
|
font=FontType.文轩体,
|
|
474
515
|
style=TextStyle(size=5.0,
|
|
@@ -484,18 +525,18 @@ seg2 = draft.TextSegment("这是一段很长的文本内容,当超过设定的
|
|
|
484
525
|
|
|
485
526
|
例如:
|
|
486
527
|
```python
|
|
487
|
-
import
|
|
528
|
+
import pycapcut as cc
|
|
488
529
|
|
|
489
530
|
# 假定已有草稿文件script(参见“快速上手”)
|
|
490
531
|
|
|
491
532
|
# 将字幕导入到名为"subtitle"的轨道中,若轨道不存在将自动创建
|
|
492
|
-
# 不指定style和clip_settings
|
|
533
|
+
# 不指定style和clip_settings,则默认模拟CapCut导入字幕时的样式
|
|
493
534
|
script.import_srt("subtitle.srt", track_name="subtitle", time_offset="1.5s") # 字幕整体后移1.5秒
|
|
494
535
|
|
|
495
536
|
# 可以利用`text_style`和`clip_settings`参数对字幕的样式进行调整, 上述参数的意义与`TextSegment()`中的相同
|
|
496
537
|
script.import_srt("subtitle.srt", track_name="subtitle",
|
|
497
|
-
text_style=
|
|
498
|
-
clip_settings=
|
|
538
|
+
text_style=cc.TextStyle(size=10.0, color=(1.0, 0.0, 0.0))
|
|
539
|
+
clip_settings=cc.ClipSettings(transform_y=0.8)) # 将字幕放置在屏幕上方
|
|
499
540
|
|
|
500
541
|
# 如果需要更复杂的样式或希望为字幕应用动画,可以为`style_reference`参数传入一个`TextSegment`对象作为样式参考(忽略其文本和片段长度设置)
|
|
501
542
|
# 注意动画时间不会根据字幕片段长度进行调节,故当字幕片段过短时可能出现奇怪的效果
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
from .local_materials import CropSettings, VideoMaterial, AudioMaterial
|
|
4
|
+
from .keyframe import KeyframeProperty
|
|
5
|
+
|
|
6
|
+
from .time_util import Timerange
|
|
7
|
+
from .audio_segment import AudioSegment
|
|
8
|
+
from .video_segment import VideoSegment, StickerSegment, ClipSettings
|
|
9
|
+
from .effect_segment import EffectSegment, FilterSegment
|
|
10
|
+
from .text_segment import TextSegment, TextStyle, TextBorder, TextBackground
|
|
11
|
+
|
|
12
|
+
from .metadata import FontType
|
|
13
|
+
from .metadata import MaskType
|
|
14
|
+
from .metadata import TransitionType, FilterType
|
|
15
|
+
from .metadata import IntroType, OutroType, GroupAnimationType
|
|
16
|
+
from .metadata import TextIntro, TextOutro, TextLoopAnim
|
|
17
|
+
from .metadata import AudioSceneEffectType
|
|
18
|
+
from .metadata import VideoSceneEffectType, VideoCharacterEffectType
|
|
19
|
+
|
|
20
|
+
from .track import TrackType
|
|
21
|
+
from .template_mode import ShrinkMode, ExtendMode
|
|
22
|
+
from .script_file import ScriptFile
|
|
23
|
+
from .draft_folder import DraftFolder
|
|
24
|
+
|
|
25
|
+
# 仅在Windows系统下导入自动导出功能
|
|
26
|
+
ISWIN = (sys.platform == 'win32')
|
|
27
|
+
if ISWIN:
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
from .time_util import SEC, tim, trange
|
|
31
|
+
|
|
32
|
+
# 基础__all__列表(所有平台通用)
|
|
33
|
+
__all__ = [
|
|
34
|
+
"FontType",
|
|
35
|
+
"MaskType",
|
|
36
|
+
"FilterType",
|
|
37
|
+
"TransitionType",
|
|
38
|
+
"IntroType",
|
|
39
|
+
"OutroType",
|
|
40
|
+
"GroupAnimationType",
|
|
41
|
+
"TextIntro",
|
|
42
|
+
"TextOutro",
|
|
43
|
+
"TextLoopAnim",
|
|
44
|
+
"AudioSceneEffectType",
|
|
45
|
+
"VideoSceneEffectType",
|
|
46
|
+
"VideoCharacterEffectType",
|
|
47
|
+
"CropSettings",
|
|
48
|
+
"VideoMaterial",
|
|
49
|
+
"AudioMaterial",
|
|
50
|
+
"KeyframeProperty",
|
|
51
|
+
"Timerange",
|
|
52
|
+
"AudioSegment",
|
|
53
|
+
"VideoSegment",
|
|
54
|
+
"StickerSegment",
|
|
55
|
+
"ClipSettings",
|
|
56
|
+
"EffectSegment",
|
|
57
|
+
"FilterSegment",
|
|
58
|
+
"TextSegment",
|
|
59
|
+
"TextStyle",
|
|
60
|
+
"TextBorder",
|
|
61
|
+
"TextBackground",
|
|
62
|
+
"TrackType",
|
|
63
|
+
"ShrinkMode",
|
|
64
|
+
"ExtendMode",
|
|
65
|
+
"ScriptFile",
|
|
66
|
+
"DraftFolder",
|
|
67
|
+
"SEC",
|
|
68
|
+
"tim",
|
|
69
|
+
"trange",
|
|
70
|
+
]
|
|
@@ -17,11 +17,11 @@ class Animation:
|
|
|
17
17
|
name: str
|
|
18
18
|
"""动画名称, 默认取为动画效果的名称"""
|
|
19
19
|
effect_id: str
|
|
20
|
-
"""另一种动画id,
|
|
20
|
+
"""另一种动画id, 由CapCut本身提供"""
|
|
21
21
|
animation_type: str
|
|
22
22
|
"""动画类型, 在子类中定义"""
|
|
23
23
|
resource_id: str
|
|
24
|
-
"""资源id,
|
|
24
|
+
"""资源id, 由CapCut本身提供"""
|
|
25
25
|
|
|
26
26
|
start: int
|
|
27
27
|
"""动画相对此片段开头的偏移, 单位为微秒"""
|