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.
Files changed (62) hide show
  1. pycapcut-0.0.2/PKG-INFO +88 -0
  2. {pycapcut-0.0.1 → pycapcut-0.0.2}/README.md +148 -107
  3. pycapcut-0.0.2/pycapcut/__init__.py +70 -0
  4. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/animation.py +2 -2
  5. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/audio_segment.py +15 -15
  6. pycapcut-0.0.2/pycapcut/config.py +69 -0
  7. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/draft_folder.py +2 -2
  8. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/jianying_controller.py +16 -16
  9. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/keyframe.py +2 -2
  10. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/local_materials.py +2 -2
  11. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/__init__.py +4 -5
  12. pycapcut-0.0.2/pycapcut/metadata/audio_scene_effect.py +761 -0
  13. pycapcut-0.0.2/pycapcut/metadata/filter_meta.py +1005 -0
  14. pycapcut-0.0.2/pycapcut/metadata/font_meta.py +359 -0
  15. pycapcut-0.0.2/pycapcut/metadata/text_intro.py +192 -0
  16. pycapcut-0.0.2/pycapcut/metadata/text_loop.py +91 -0
  17. pycapcut-0.0.2/pycapcut/metadata/text_outro.py +110 -0
  18. pycapcut-0.0.2/pycapcut/metadata/transition_meta.py +2284 -0
  19. pycapcut-0.0.2/pycapcut/metadata/video_character_effect.py +2041 -0
  20. pycapcut-0.0.2/pycapcut/metadata/video_group_animation.py +118 -0
  21. pycapcut-0.0.2/pycapcut/metadata/video_intro.py +261 -0
  22. pycapcut-0.0.2/pycapcut/metadata/video_outro.py +229 -0
  23. pycapcut-0.0.2/pycapcut/metadata/video_scene_effect.py +10832 -0
  24. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/script_file.py +6 -6
  25. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/segment.py +1 -1
  26. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/text_segment.py +10 -10
  27. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/video_segment.py +6 -6
  28. pycapcut-0.0.2/pycapcut.egg-info/PKG-INFO +88 -0
  29. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/SOURCES.txt +1 -0
  30. {pycapcut-0.0.1 → pycapcut-0.0.2}/setup.py +3 -3
  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.2}/pycapcut/assets/__init__.py +0 -0
  47. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/assets/draft_content_template.json +0 -0
  48. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/assets/draft_meta_info.json +0 -0
  49. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/effect_segment.py +0 -0
  50. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/exceptions.py +0 -0
  51. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/effect_meta.py +0 -0
  52. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/mask_meta.py +0 -0
  53. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/speech_to_song.py +0 -0
  54. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/metadata/tone_effect.py +0 -0
  55. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/template_mode.py +0 -0
  56. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/time_util.py +0 -0
  57. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/track.py +0 -0
  58. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut/util.py +0 -0
  59. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/dependency_links.txt +0 -0
  60. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/requires.txt +0 -0
  61. {pycapcut-0.0.1 → pycapcut-0.0.2}/pycapcut.egg-info/top_level.txt +0 -0
  62. {pycapcut-0.0.1 → pycapcut-0.0.2}/setup.cfg +0 -0
@@ -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
+ ![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
  - ☑️ [视频整体调节](#视频整体调节)(旋转、缩放、亮度等)以及[关键帧生成](#关键帧)
@@ -55,17 +60,15 @@
55
60
  - ☑️ [导入`.srt`文件](#导入字幕)生成字幕并批量设置格式
56
61
 
57
62
  # 快速上手
58
- 例程`demo.py`将创建包含音视频素材和一行文本的剪映草稿文件,并且添加了音频淡入、视频入场动画、转场效果和文本气泡/花字。
63
+ 例程`demo.py`将创建包含音视频素材和一行文本的CapCut草稿文件,并且添加了音频淡入、视频入场动画、转场效果、关键帧和文本气泡/花字。
59
64
 
60
65
  这个例程的操作方法如下:
61
- 1. 找到剪映的**草稿文件夹路径**(类似`.../JianyingPro Drafts`),用其替换代码中的`<你的草稿文件夹>`
66
+ 1. 找到CapCut的**草稿文件夹路径**(类似`.../CapCut Drafts`),用其替换代码中的`<你的草稿文件夹>`
62
67
  2. 运行`demo.py`
63
- 3. 在剪映中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启剪映以刷新草稿列表),你应该看到类似如下的时间轴:
68
+ 3. 在CapCut中**找到并打开新创建的`demo`草稿**(可能需要进入再退出某个已有草稿,或重启CapCut以刷新草稿列表),你应该看到类似如下的时间轴:
64
69
 
65
70
  ![快速上手](readme_assets/快速上手.png)
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 pyJianYingDraft as draft
96
+ import pycapcut as cc
94
97
 
95
- draft_folder = draft.DraftFolder("<剪映草稿文件夹>") # 一般形如 ".../JianyingPro Drafts"
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
- 为了最大限度地兼容模板中的复杂特性,**导入的轨道与pyJianYingDraft创建的轨道是分离开的**,具体地讲:
106
+ 为了最大限度地兼容模板中的复杂特性,**导入的轨道与pycapcut创建的轨道是分离开的**,具体地讲:
104
107
 
105
108
  - 除下述替换功能外,不能在导入的轨道上添加片段、转场、淡入淡出、特效等
106
109
  - **仍然可以创建新的轨道,并在其上添加片段等**,就像非模板模式一样
@@ -112,9 +115,9 @@ script.save() # 保存你的"新草稿"
112
115
  `DraftFolder`也有相应的方法来提取指定草稿的素材元数据。
113
116
 
114
117
  ```python
115
- import pyJianYingDraft as draft
118
+ import pycapcut as cc
116
119
 
117
- draft_folder = draft.DraftFolder("<剪映草稿文件夹>")
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 = draft.AudioMaterial("<新的音频素材路径>")
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 pyJianYingDraft import trange, ShrinkMode, ExtendMode
166
+ from pycapcut import trange, ShrinkMode, ExtendMode
164
167
 
165
168
  audio_track = script.get_imported_track(
166
- draft.TrackType.audio, # 选取导入的音频轨道
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
- draft.TrackType.text, # 选取导入的文本轨道
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 pyJianYingDraft as draft
287
- from pyJianYingDraft import SEC, tim, trange
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 draft.Timerange(0, 60*SEC) == trange("0s", "1m") == trange("0s", "0.5m30s")
255
+ assert cc.Timerange(0, 60*SEC) == trange("0s", "1m") == trange("0s", "0.5m30s")
294
256
 
295
257
  # 片段开始后2秒
296
- seg: draft.VideoSegment
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 pyJianYingDraft as draft
311
- from pyJianYingDraft import trange, SEC
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(draft.TrackType.video, "%d" % i)
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 = draft.VideoSegment(video_path, trange("0s", "4s")) # 截取素材的前4秒
285
+ seg1 = cc.VideoSegment(video_path, trange("0s", "4s")) # 截取素材的前4秒
324
286
 
325
287
  # 方式二:传统构造
326
- mat = draft.VideoMaterial(video_path) # 先创建素材实例
327
- seg2 = draft.VideoSegment(mat, trange("0s", "4s")) # 再传入片段构造函数
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 = 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秒,素材不够长故报错
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 = draft.VideoSegment(video_path, trange("4s", "1s"),
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 = draft.VideoSegment(video_path, trange("1s", "66666h"),
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(draft.TrackType.video,
318
+ script.add_track(cc.TrackType.video,
360
319
  track_name="前景", # 轨道名
361
320
  relative_index=2) # 在所有视频轨道中的相对位置
362
- script.add_track(draft.TrackType.video,
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 pyJianYingDraft import ClipSettings
381
- video_segment = draft.VideoSegment(video_material,
382
- draft.Timerange(0, video_material.duration), # 与素材等长
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 pyJianYingDraft as draft
398
- from pyJianYingDraft import KeyframeProperty, SEC
356
+ import pycapcut as cc
357
+ from pycapcut import KeyframeProperty, SEC
399
358
 
400
359
  # 假定已有草稿文件script(参见“快速上手”),创建视频轨道
401
- script.add_track(draft.TrackType.video)
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 = draft.VideoMaterial(os.path.join(tutorial_asset_dir, 'video.mp4'))
406
- video_segment = draft.VideoSegment(video_material,
407
- draft.Timerange(0, video_material.duration)) # 与素材等长
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: draft.AudioSegment
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 pyJianYingDraft import MaskType
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
+ ![特效类型](readme_assets/片段特效_annotation.jpg)
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 pyJianYingDraft as draft
455
- from pyJianYingDraft import FontType, TextStyle, ClipSettings
495
+ import pycapcut as cc
496
+ from pycapcut import FontType, TextStyle, ClipSettings
456
497
 
457
498
  # 带下划线、位置及大小类似字幕的浅蓝色文本
458
- seg1 = draft.TextSegment("Subtitle", trange("0s", "10s"),
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 = draft.TextSegment("这是一段很长的文本内容,当超过设定的最大行宽时会自动换行显示",
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 pyJianYingDraft as draft
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=draft.TextStyle(size=10.0, color=(1.0, 0.0, 0.0))
498
- clip_settings=draft.ClipSettings(transform_y=0.8)) # 将字幕放置在屏幕上方
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
  """动画相对此片段开头的偏移, 单位为微秒"""