pycapcut 0.0.1__tar.gz → 0.0.3__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.3/PKG-INFO +88 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/README.md +157 -107
- pycapcut-0.0.3/pycapcut/__init__.py +70 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/animation.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/audio_segment.py +15 -15
- pycapcut-0.0.3/pycapcut/config.py +69 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/draft_folder.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/jianying_controller.py +16 -16
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/keyframe.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/local_materials.py +2 -2
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/__init__.py +4 -5
- pycapcut-0.0.3/pycapcut/metadata/audio_scene_effect.py +761 -0
- pycapcut-0.0.3/pycapcut/metadata/filter_meta.py +1005 -0
- pycapcut-0.0.3/pycapcut/metadata/font_meta.py +359 -0
- pycapcut-0.0.3/pycapcut/metadata/text_intro.py +192 -0
- pycapcut-0.0.3/pycapcut/metadata/text_loop.py +91 -0
- pycapcut-0.0.3/pycapcut/metadata/text_outro.py +110 -0
- pycapcut-0.0.3/pycapcut/metadata/transition_meta.py +2284 -0
- pycapcut-0.0.3/pycapcut/metadata/video_character_effect.py +2041 -0
- pycapcut-0.0.3/pycapcut/metadata/video_group_animation.py +118 -0
- pycapcut-0.0.3/pycapcut/metadata/video_intro.py +261 -0
- pycapcut-0.0.3/pycapcut/metadata/video_outro.py +229 -0
- pycapcut-0.0.3/pycapcut/metadata/video_scene_effect.py +10832 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/script_file.py +6 -6
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/segment.py +1 -1
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/text_segment.py +10 -10
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/video_segment.py +6 -6
- pycapcut-0.0.3/pycapcut.egg-info/PKG-INFO +88 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/SOURCES.txt +1 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/setup.py +2 -2
- 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.3}/pycapcut/assets/__init__.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/assets/draft_content_template.json +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/assets/draft_meta_info.json +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/effect_segment.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/exceptions.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/effect_meta.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/mask_meta.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/speech_to_song.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/tone_effect.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/template_mode.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/time_util.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/track.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/util.py +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/dependency_links.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/requires.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/top_level.txt +0 -0
- {pycapcut-0.0.1 → pycapcut-0.0.3}/setup.cfg +0 -0
pycapcut-0.0.3/PKG-INFO
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: pycapcut
|
|
3
|
+
Version: 0.0.3
|
|
4
|
+
Summary: A lightweight, flexible, and easy-to-use Python tool for generating and exporting CapCut drafts to build fully automated video editing/remix pipelines!
|
|
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
|
- ☑️ [视频整体调节](#视频整体调节)(旋转、缩放、亮度等)以及[关键帧生成](#关键帧)
|
|
@@ -54,18 +59,25 @@
|
|
|
54
59
|
- ☑️ 文本[自动换行](#文本自动换行),支持设置最大行宽
|
|
55
60
|
- ☑️ [导入`.srt`文件](#导入字幕)生成字幕并批量设置格式
|
|
56
61
|
|
|
62
|
+
# 安装
|
|
63
|
+
pyCapCut现已支持pip安装(不含demo)
|
|
64
|
+
```
|
|
65
|
+
pip install pycapcut
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 跨平台兼容性
|
|
69
|
+
Linux和MacOS用户也可正常安装和使用,但注意**生成的草稿仍然需要在Windows版CapCut下导出**。
|
|
70
|
+
|
|
57
71
|
# 快速上手
|
|
58
|
-
例程`demo.py
|
|
72
|
+
例程`demo.py`将创建包含音视频素材和一行文本的CapCut草稿文件,并且添加了音频淡入、视频入场动画、转场效果、关键帧和文本气泡/花字。
|
|
59
73
|
|
|
60
74
|
这个例程的操作方法如下:
|
|
61
|
-
1.
|
|
75
|
+
1. 找到CapCut的**草稿文件夹路径**(类似`.../CapCut Drafts`),用其替换代码中的`<你的草稿文件夹>`
|
|
62
76
|
2. 运行`demo.py`
|
|
63
|
-
3.
|
|
77
|
+
3. 在CapCut中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启CapCut以刷新草稿列表),你应该看到类似如下的时间轴:
|
|
64
78
|
|
|
65
79
|

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

|
|
427
|
+
|
|
428
|
+
你也可以使用`from_name`方法来获取特定的成员,其忽略大小写、空格和下划线,例如:
|
|
429
|
+
|
|
430
|
+
```python
|
|
431
|
+
assert VideoSceneEffectType.from_name("__全息 扫描__") == VideoSceneEffectType.全息扫描
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
> ⚠️ 并非所有在枚举类中的特效均可用,**请确认能在CapCut窗口中找到该特效再使用**
|
|
435
|
+
|
|
436
|
+
#### 添加片段特效
|
|
437
|
+
添加特效使用的方法是`segment.add_effect()`,它接受特效类型和一个参数数组,参数数组的顺序**与特效类型注释中的参数顺序一致**,但**不一定与CapCut内的参数顺序一致**。
|
|
438
|
+
|
|
439
|
+
下方的例子为视频片段添加一个`全息扫描`特效,并且指定其`氛围`参数为(CapCut中的)100,其余参数默认:
|
|
440
|
+
```python
|
|
441
|
+
from pyJianYingDraft import VideoSceneEffectType
|
|
442
|
+
|
|
443
|
+
video_segment.add_effect(VideoSceneEffectType.全息扫描,
|
|
444
|
+
[None, None, 100.0]) # 不设置前两个参数, 第三个参数(氛围)为100,其余参数也不设置
|
|
445
|
+
```
|
|
446
|
+
音频片段的特效添加方法与视频片段相似
|
|
447
|
+
|
|
448
|
+
#### 添加片段滤镜
|
|
449
|
+
滤镜的添加方法与特效类似,其使用的是`VideoSegment.add_filter()`方法。
|
|
450
|
+
与特效不同的是,滤镜只支持一个“滤镜强度”参数。
|
|
451
|
+
|
|
452
|
+
```python
|
|
453
|
+
from pyJianYingDraft import FilterType
|
|
454
|
+
|
|
455
|
+
video_segment1.add_filter(FilterType.原生肤, 10) # 设置"原生肤"强度为10
|
|
456
|
+
video_segment2.add_filter(FilterType.冰雪世界, 50) # 设置"冰雪世界"强度为50
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
#### 独立轨道上的特效和滤镜
|
|
460
|
+
除了为视频片段添加特效和滤镜外,你还可以创建独立的特效轨道和滤镜轨道,并在其上添加特效和滤镜片段。
|
|
461
|
+
|
|
462
|
+
首先使用`ScriptFile.add_track()`方法创建特效轨道或滤镜轨道。若需要指定顺序请参考[多轨道操作](#多轨道操作)
|
|
463
|
+
```python
|
|
464
|
+
script.add_track(draft.TrackType.effect, "my_effect") # 创建名为"my_effect"的特效轨道
|
|
465
|
+
script.add_track(draft.TrackType.filter, "my_filter") # 创建名为"my_filter"的滤镜轨道
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
接下来便可使用`add_effect`和`add_filter`方法向这些轨道添加片段:
|
|
469
|
+
```python
|
|
470
|
+
from pyJianYingDraft import VideoSceneEffectType, FilterType, trange
|
|
471
|
+
|
|
472
|
+
# 在特效轨道上添加一个"胶片闪切"特效,持续5秒,并设置其参数
|
|
473
|
+
script.add_effect(VideoSceneEffectType.胶片闪切, trange("0s", "5s"),
|
|
474
|
+
track_name="my_effect", # 当特效轨道只有一条时可省略
|
|
475
|
+
params=[50, None, 80]) # 设置速度为50,保持强度默认(100),设置纹理为80
|
|
476
|
+
|
|
477
|
+
# 在滤镜轨道上添加一个"哈苏蓝"滤镜,持续整个视频,强度为70
|
|
478
|
+
script.add_filter(FilterType.冷蓝, trange(0, script.duration),
|
|
479
|
+
track_name="my_filter", # 当滤镜轨道只有一条时可省略
|
|
480
|
+
intensity=70)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
#### 添加片段动画
|
|
484
|
+
添加动画使用的方法是`segment.add_animation()`,其仅接收一个动画类型作为参数,动画的持续时间由其默认值决定。若需要添加多个动画,可对同一个片段调用多次该方法。
|
|
485
|
+
|
|
486
|
+
> ℹ 为**文本片段**同时设置循环动画和入出场动画时, 请**先添加出入场动画再添加循环动画**
|
|
487
|
+
|
|
488
|
+
以下是为一个文本片段添加三种动画的例子:
|
|
489
|
+
```python
|
|
490
|
+
from pyJianYingDraft import TextIntro, TextOutro, TextLoopAnim
|
|
491
|
+
|
|
492
|
+
text_seg.add_animation(TextIntro.复古打字机).add_animation(TextOutro.弹簧)
|
|
493
|
+
text_seg.add_animation(TextLoopAnim.色差故障) # 注意:循环动画必须在出入场动画之后添加
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
|
|
447
497
|
### 文本及字幕
|
|
448
498
|
#### 添加文本
|
|
449
499
|
添加文本与添加视频/音频片段类似,只需创建`TextSegment`对象并利用`add_segment`添加到`ScriptFile`中即可。
|
|
@@ -451,11 +501,11 @@ video_segment2.add_mask(MaskType.圆形, size=0.5)
|
|
|
451
501
|
|
|
452
502
|
例如:
|
|
453
503
|
```python
|
|
454
|
-
import
|
|
455
|
-
from
|
|
504
|
+
import pycapcut as cc
|
|
505
|
+
from pycapcut import FontType, TextStyle, ClipSettings
|
|
456
506
|
|
|
457
507
|
# 带下划线、位置及大小类似字幕的浅蓝色文本
|
|
458
|
-
seg1 =
|
|
508
|
+
seg1 = cc.TextSegment("Subtitle", trange("0s", "10s"),
|
|
459
509
|
font=FontType.文轩体,
|
|
460
510
|
style=TextStyle(size=5.0, color=(0.7, 0.7, 1.0), underline=True, align=1),
|
|
461
511
|
clip_settings=ClipSettings(transform_y=-0.8))
|
|
@@ -468,7 +518,7 @@ seg1 = draft.TextSegment("Subtitle", trange("0s", "10s"),
|
|
|
468
518
|
|
|
469
519
|
```python
|
|
470
520
|
# 启用自动换行,设置最大行宽为屏幕宽度的70%
|
|
471
|
-
seg2 =
|
|
521
|
+
seg2 = cc.TextSegment("这是一段很长的文本内容,当超过设定的最大行宽时会自动换行显示",
|
|
472
522
|
trange("0s", "10s"),
|
|
473
523
|
font=FontType.文轩体,
|
|
474
524
|
style=TextStyle(size=5.0,
|
|
@@ -484,18 +534,18 @@ seg2 = draft.TextSegment("这是一段很长的文本内容,当超过设定的
|
|
|
484
534
|
|
|
485
535
|
例如:
|
|
486
536
|
```python
|
|
487
|
-
import
|
|
537
|
+
import pycapcut as cc
|
|
488
538
|
|
|
489
539
|
# 假定已有草稿文件script(参见“快速上手”)
|
|
490
540
|
|
|
491
541
|
# 将字幕导入到名为"subtitle"的轨道中,若轨道不存在将自动创建
|
|
492
|
-
# 不指定style和clip_settings
|
|
542
|
+
# 不指定style和clip_settings,则默认模拟CapCut导入字幕时的样式
|
|
493
543
|
script.import_srt("subtitle.srt", track_name="subtitle", time_offset="1.5s") # 字幕整体后移1.5秒
|
|
494
544
|
|
|
495
545
|
# 可以利用`text_style`和`clip_settings`参数对字幕的样式进行调整, 上述参数的意义与`TextSegment()`中的相同
|
|
496
546
|
script.import_srt("subtitle.srt", track_name="subtitle",
|
|
497
|
-
text_style=
|
|
498
|
-
clip_settings=
|
|
547
|
+
text_style=cc.TextStyle(size=10.0, color=(1.0, 0.0, 0.0))
|
|
548
|
+
clip_settings=cc.ClipSettings(transform_y=0.8)) # 将字幕放置在屏幕上方
|
|
499
549
|
|
|
500
550
|
# 如果需要更复杂的样式或希望为字幕应用动画,可以为`style_reference`参数传入一个`TextSegment`对象作为样式参考(忽略其文本和片段长度设置)
|
|
501
551
|
# 注意动画时间不会根据字幕片段长度进行调节,故当字幕片段过短时可能出现奇怪的效果
|
|
@@ -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
|
+
]
|