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.
Files changed (62) hide show
  1. pycapcut-0.0.3/PKG-INFO +88 -0
  2. {pycapcut-0.0.1 → pycapcut-0.0.3}/README.md +157 -107
  3. pycapcut-0.0.3/pycapcut/__init__.py +70 -0
  4. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/animation.py +2 -2
  5. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/audio_segment.py +15 -15
  6. pycapcut-0.0.3/pycapcut/config.py +69 -0
  7. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/draft_folder.py +2 -2
  8. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/jianying_controller.py +16 -16
  9. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/keyframe.py +2 -2
  10. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/local_materials.py +2 -2
  11. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/__init__.py +4 -5
  12. pycapcut-0.0.3/pycapcut/metadata/audio_scene_effect.py +761 -0
  13. pycapcut-0.0.3/pycapcut/metadata/filter_meta.py +1005 -0
  14. pycapcut-0.0.3/pycapcut/metadata/font_meta.py +359 -0
  15. pycapcut-0.0.3/pycapcut/metadata/text_intro.py +192 -0
  16. pycapcut-0.0.3/pycapcut/metadata/text_loop.py +91 -0
  17. pycapcut-0.0.3/pycapcut/metadata/text_outro.py +110 -0
  18. pycapcut-0.0.3/pycapcut/metadata/transition_meta.py +2284 -0
  19. pycapcut-0.0.3/pycapcut/metadata/video_character_effect.py +2041 -0
  20. pycapcut-0.0.3/pycapcut/metadata/video_group_animation.py +118 -0
  21. pycapcut-0.0.3/pycapcut/metadata/video_intro.py +261 -0
  22. pycapcut-0.0.3/pycapcut/metadata/video_outro.py +229 -0
  23. pycapcut-0.0.3/pycapcut/metadata/video_scene_effect.py +10832 -0
  24. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/script_file.py +6 -6
  25. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/segment.py +1 -1
  26. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/text_segment.py +10 -10
  27. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/video_segment.py +6 -6
  28. pycapcut-0.0.3/pycapcut.egg-info/PKG-INFO +88 -0
  29. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/SOURCES.txt +1 -0
  30. {pycapcut-0.0.1 → pycapcut-0.0.3}/setup.py +2 -2
  31. pycapcut-0.0.1/PKG-INFO +0 -77
  32. pycapcut-0.0.1/pycapcut/__init__.py +0 -276
  33. pycapcut-0.0.1/pycapcut/metadata/audio_scene_effect.py +0 -252
  34. pycapcut-0.0.1/pycapcut/metadata/filter_meta.py +0 -603
  35. pycapcut-0.0.1/pycapcut/metadata/font_meta.py +0 -341
  36. pycapcut-0.0.1/pycapcut/metadata/text_intro.py +0 -152
  37. pycapcut-0.0.1/pycapcut/metadata/text_loop.py +0 -105
  38. pycapcut-0.0.1/pycapcut/metadata/text_outro.py +0 -105
  39. pycapcut-0.0.1/pycapcut/metadata/transition_meta.py +0 -733
  40. pycapcut-0.0.1/pycapcut/metadata/video_character_effect.py +0 -1913
  41. pycapcut-0.0.1/pycapcut/metadata/video_group_animation.py +0 -131
  42. pycapcut-0.0.1/pycapcut/metadata/video_intro.py +0 -103
  43. pycapcut-0.0.1/pycapcut/metadata/video_outro.py +0 -80
  44. pycapcut-0.0.1/pycapcut/metadata/video_scene_effect.py +0 -7706
  45. pycapcut-0.0.1/pycapcut.egg-info/PKG-INFO +0 -77
  46. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/assets/__init__.py +0 -0
  47. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/assets/draft_content_template.json +0 -0
  48. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/assets/draft_meta_info.json +0 -0
  49. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/effect_segment.py +0 -0
  50. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/exceptions.py +0 -0
  51. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/effect_meta.py +0 -0
  52. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/mask_meta.py +0 -0
  53. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/speech_to_song.py +0 -0
  54. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/metadata/tone_effect.py +0 -0
  55. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/template_mode.py +0 -0
  56. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/time_util.py +0 -0
  57. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/track.py +0 -0
  58. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut/util.py +0 -0
  59. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/dependency_links.txt +0 -0
  60. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/requires.txt +0 -0
  61. {pycapcut-0.0.1 → pycapcut-0.0.3}/pycapcut.egg-info/top_level.txt +0 -0
  62. {pycapcut-0.0.1 → pycapcut-0.0.3}/setup.cfg +0 -0
@@ -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
+ ![Workflow](https://github.com/GuanYixuan/pyJianYingDraft/raw/main/readme_assets/%E4%BD%BF%E7%94%A8%E6%80%9D%E8%B7%AF.jpg)
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
- > ⚠️ 本模块与特效/滤镜/动画等相关的功能正在迁移中,若有兴趣可参见[PyJianYingDraft中相应部分](https://github.com/GuanYixuan/pyJianYingDraft?tab=readme-ov-file#%E8%A7%86%E9%A2%91%E4%B8%8E%E5%9B%BE%E7%89%87)
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. 找到剪映的**草稿文件夹路径**(类似`.../JianyingPro Drafts`),用其替换代码中的`<你的草稿文件夹>`
75
+ 1. 找到CapCut的**草稿文件夹路径**(类似`.../CapCut Drafts`),用其替换代码中的`<你的草稿文件夹>`
62
76
  2. 运行`demo.py`
63
- 3. 在剪映中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启剪映以刷新草稿列表),你应该看到类似如下的时间轴:
77
+ 3. 在CapCut中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启CapCut以刷新草稿列表),你应该看到类似如下的时间轴:
64
78
 
65
79
  ![快速上手](readme_assets/快速上手.png)
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 pyJianYingDraft as draft
105
+ import pycapcut as cc
94
106
 
95
- draft_folder = draft.DraftFolder("<剪映草稿文件夹>") # 一般形如 ".../JianyingPro Drafts"
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
- 为了最大限度地兼容模板中的复杂特性,**导入的轨道与pyJianYingDraft创建的轨道是分离开的**,具体地讲:
115
+ 为了最大限度地兼容模板中的复杂特性,**导入的轨道与pycapcut创建的轨道是分离开的**,具体地讲:
104
116
 
105
117
  - 除下述替换功能外,不能在导入的轨道上添加片段、转场、淡入淡出、特效等
106
118
  - **仍然可以创建新的轨道,并在其上添加片段等**,就像非模板模式一样
@@ -112,9 +124,9 @@ script.save() # 保存你的"新草稿"
112
124
  `DraftFolder`也有相应的方法来提取指定草稿的素材元数据。
113
125
 
114
126
  ```python
115
- import pyJianYingDraft as draft
127
+ import pycapcut as cc
116
128
 
117
- draft_folder = draft.DraftFolder("<剪映草稿文件夹>")
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 = draft.AudioMaterial("<新的音频素材路径>")
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 pyJianYingDraft import trange, ShrinkMode, ExtendMode
175
+ from pycapcut import trange, ShrinkMode, ExtendMode
164
176
 
165
177
  audio_track = script.get_imported_track(
166
- draft.TrackType.audio, # 选取导入的音频轨道
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
- draft.TrackType.text, # 选取导入的文本轨道
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 pyJianYingDraft as draft
287
- from pyJianYingDraft import SEC, tim, trange
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 draft.Timerange(0, 60*SEC) == trange("0s", "1m") == trange("0s", "0.5m30s")
264
+ assert cc.Timerange(0, 60*SEC) == trange("0s", "1m") == trange("0s", "0.5m30s")
294
265
 
295
266
  # 片段开始后2秒
296
- seg: draft.VideoSegment
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 pyJianYingDraft as draft
311
- from pyJianYingDraft import trange, SEC
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(draft.TrackType.video, "%d" % i)
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 = draft.VideoSegment(video_path, trange("0s", "4s")) # 截取素材的前4秒
294
+ seg1 = cc.VideoSegment(video_path, trange("0s", "4s")) # 截取素材的前4秒
324
295
 
325
296
  # 方式二:传统构造
326
- mat = draft.VideoMaterial(video_path) # 先创建素材实例
327
- seg2 = draft.VideoSegment(mat, trange("0s", "4s")) # 再传入片段构造函数
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 = draft.VideoSegment(video_path, trange("0s", "4s")) # 自动截取素材的前4秒(4s表示持续时长)
335
- seg2 = draft.VideoSegment(video_path, trange("0s", "4s"), speed=1.25) # 自动截取素材的前4*1.25=5秒
336
- seg4 = draft.VideoSegment(video_path, trange("0s", "3s"), speed=3.0) # 截取前3*3.0=9秒,素材不够长故报错
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 = draft.VideoSegment(video_path, trange("4s", "1s"),
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 = draft.VideoSegment(video_path, trange("1s", "66666h"),
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(draft.TrackType.video,
327
+ script.add_track(cc.TrackType.video,
360
328
  track_name="前景", # 轨道名
361
329
  relative_index=2) # 在所有视频轨道中的相对位置
362
- script.add_track(draft.TrackType.video,
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 pyJianYingDraft import ClipSettings
381
- video_segment = draft.VideoSegment(video_material,
382
- draft.Timerange(0, video_material.duration), # 与素材等长
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 pyJianYingDraft as draft
398
- from pyJianYingDraft import KeyframeProperty, SEC
365
+ import pycapcut as cc
366
+ from pycapcut import KeyframeProperty, SEC
399
367
 
400
368
  # 假定已有草稿文件script(参见“快速上手”),创建视频轨道
401
- script.add_track(draft.TrackType.video)
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 = draft.VideoMaterial(os.path.join(tutorial_asset_dir, 'video.mp4'))
406
- video_segment = draft.VideoSegment(video_material,
407
- draft.Timerange(0, video_material.duration)) # 与素材等长
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: draft.AudioSegment
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 pyJianYingDraft import MaskType
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
+ ![特效类型](readme_assets/片段特效_annotation.jpg)
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 pyJianYingDraft as draft
455
- from pyJianYingDraft import FontType, TextStyle, ClipSettings
504
+ import pycapcut as cc
505
+ from pycapcut import FontType, TextStyle, ClipSettings
456
506
 
457
507
  # 带下划线、位置及大小类似字幕的浅蓝色文本
458
- seg1 = draft.TextSegment("Subtitle", trange("0s", "10s"),
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 = draft.TextSegment("这是一段很长的文本内容,当超过设定的最大行宽时会自动换行显示",
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 pyJianYingDraft as draft
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=draft.TextStyle(size=10.0, color=(1.0, 0.0, 0.0))
498
- clip_settings=draft.ClipSettings(transform_y=0.8)) # 将字幕放置在屏幕上方
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
+ ]