剪映创建草稿文件,关键的两个文件,draft_content.json和draft_meta_info.json,只需要创建这两个文件,剪映会自动补全其他文件。
1 创建两个模版,用于初始化数据。
draft_content_data.json的数据
{ "canvas_config": { "height": 1920, "ratio": "original", "width": 1920 }, "color_space": 0, "config": { "adjust_max_index": 1, "attachment_info": [], "combination_max_index": 1, "export_range": null, "extract_audio_last_index": 1, "lyrics_recognition_id": "", "lyrics_sync": true, "lyrics_taskinfo": [], "maintrack_adsorb": true, "material_save_mode": 0, "original_sound_last_index": 1, "record_audio_last_index": 1, "sticker_max_index": 1, "subtitle_recognition_id": "", "subtitle_sync": true, "subtitle_taskinfo": [], "system_font_list": [], "video_mute": false, "zoom_info_params": null }, "cover": null, "create_time": 0, "duration": 20000000, "extra_info": null, "fps": 30.0, "free_render_index_mode_on": false, "group_container": null, "id": "", "keyframe_graph_list": [], "keyframes": { "adjusts": [], "audios": [], "effects": [], "filters": [], "handwrites": [], "stickers": [], "texts": [], "videos": [] }, "last_modified_platform": { "app_id": 3704, "app_source": "lv", "app_version": "4.7.2", "device_id": "fc871fd0f7df9197856c41e5c14692e3", "hard_disk_id": "41242e7a5bd929da250d4f775eb50880", "mac_address": "bd3b6e089f498a7037dc279f6ee07f73", "os": "windows", "os_version": "10.0.22621" }, "materials": { "audio_balances": [], "audio_effects": [], "audio_fades": [], "audios": [], "beats": [], "canvases": [], "chromas": [], "color_curves": [], "digital_humans": [], "drafts": [], "effects": [], "flowers": [], "green_screens": [], "handwrites": [], "hsl": [], "images": [], "log_color_wheels": [], "loudnesses": [], "manual_deformations": [], "masks": [], "material_animations": [], "material_colors": [], "placeholders": [], "plugin_effects": [], "primary_color_wheels": [], "realtime_denoises": [], "shapes": [], "smart_crops": [], "sound_channel_mappings": [], "speeds": [], "stickers": [], "tail_leaders": [], "text_templates": [], "texts": [], "transitions": [], "video_effects": [], "video_trackings": [], "videos": [], "vocal_beautifys": [], "vocal_separations": [] }, "mutable_config": null, "name": "", "new_version": "87.0.0", "platform": { "app_id": 3704, "app_source": "lv", "app_version": "4.7.2", "device_id": "fc871fd0f7df9197856c41e5c14692e3", "hard_disk_id": "41242e7a5bd929da250d4f775eb50880", "mac_address": "bd3b6e089f498a7037dc279f6ee07f73", "os": "windows", "os_version": "10.0.22621" }, "relationships": [], "render_index_track_mode_on": false, "retouch_cover": null, "source": "default", "static_cover_image_path": "", "tracks": [], "update_time": 0, "version": 360000 }
draft_meta_data.json
{ "cloud_package_completed_time": "", "draft_cloud_capcut_purchase_info": "", "draft_cloud_last_action_download": false, "draft_cloud_materials": [], "draft_cloud_purchase_info": "", "draft_cloud_template_id": "", "draft_cloud_tutorial_info": "", "draft_cloud_videocut_purchase_info": "", "draft_cover": "draft_cover.jpg", "draft_deeplink_url": "", "draft_enterprise_info": { "draft_enterprise_extra": "", "draft_enterprise_id": "", "draft_enterprise_name": "", "enterprise_material": [] }, "draft_fold_path": "", "draft_id": "", "draft_is_article_video_draft": false, "draft_is_from_deeplink": "false", "draft_materials": [ { "type": 0, "value": [] }, { "type": 1, "value": [] }, { "type": 2, "value": [] }, { "type": 3, "value": [] }, { "type": 6, "value": [] }, { "type": 7, "value": [] }, { "type": 8, "value": [] } ], "draft_materials_copied_info": [], "draft_name": "", "draft_new_version": "", "draft_removable_storage_device": "", "draft_root_path": "", "draft_segment_extra_info": [], "draft_timeline_materials_size_": 0, "tm_draft_cloud_completed": "", "tm_draft_cloud_modified": 0, "tm_draft_create": 0, "tm_draft_modified": 0, "tm_draft_removed": 0, "tm_duration": 0 }
分析json,在剪映里导入一张图片
draft_content.json的变化,
canvases,
sound_channel_mappings,
speeds,
videos,
vocal_separations
tracks
tracks下的segments
我添加了4张图片。经过分析。
canvases,
sound_channel_mappings,
speeds,
videos,
vocal_separations
tracks
tracks下的segments键值对都会有添加数据,
注意细节:
sound_channel_mappings,
speeds,
videos,
vocal_separations
tracks下的segments
在添加了图片后,都会在每一个数组里添加4个数据,但是tracks只会创建一个,而tracks下的segments是添加了4个数据。
经过分析这4个数据的id对应情况,
videos的id对应tracks下的segments的material_id
而这4个ID对应
第一个对应materials下的speeds里的id,
第二个对应materials下的canvases里的id
第三个对应materials下的sound_channel_mappings里的id
第三个对应materials下的vocal_separations里的id
canvases的数据
{ "album_image": "", "blur": 0, "color": "", "id": "4B6E427A-A0CE-4CB5-8FDD-625D3C46FFD1", // 此ID对应tracks第0个的segments里的extra_material_refs第2个 "image": "", "image_id": "", "image_name": "", "source_platform": 0, "team_id": "", "type": "canvas_color" }
sound_channel_mappings的数据
{ "audio_channel_mapping": 0, "id": "03559466-D479-45D4-ACE8-5C93C295C32C", // 此id// 此ID对应tracks第0个的segments里的extra_material_refs第3个 "is_config_open": false, "type": "none" }
speeds的数据
{ "curve_speed": null, "id": "DC6EC53C-3497-46CE-AF3A-61B002016226", // 此id// 此ID对应tracks第0个的segments里的extra_material_refs第1个 "mode": 0, "speed": 1, "type": "speed" }
vocal_separations的数据
{ "choice": 0, "id": "BB3B2A8D-31ED-4AF3-BB2F-389F52FE714D", // 此id// 此ID对应tracks第0个的segments里的extra_material_refs第4个 "production_path": "", "time_range": null, "type": "vocal_separation" }
videos下的数据
{ "aigc_type": "none", "audio_fade": null, "cartoon_path": "", "category_id": "", "category_name": "local", "check_flag": 63487, "crop": { "lower_left_x": 0, "lower_left_y": 1, "lower_right_x": 1, "lower_right_y": 1, "upper_left_x": 0, "upper_left_y": 0, "upper_right_x": 1, "upper_right_y": 0 }, "crop_ratio": "free", "crop_scale": 1, "duration": 10800000000, "extra_type_option": 0, "formula_id": "", "freeze": null, "gameplay": null, "has_audio": false, "height": 1080, // 图片高度 "id": "13F7F3F1-663C-4F28-8616-489EB3799964", // 此id对应tracks下的segments的material_id "intensifies_audio_path": "", "intensifies_path": "", "is_ai_generate_content": false, "is_unified_beauty_mode": false, "local_id": "", "local_material_id": "", "material_id": "", "material_name": "1.png", // 图片名称 "material_url": "", "matting": { "flag": 0, "has_use_quick_brush": false, "has_use_quick_eraser": false, "interactiveTime": [], "path": "", "strokes": [] }, "media_path": "", "object_locked": null, "origin_material_id": "", "path": "C:/Users/lsl/Desktop/tttest/1.png", // 图片完整路劲 "picture_from": "none", "picture_set_category_id": "", "picture_set_category_name": "", "request_id": "", "reverse_intensifies_path": "", "reverse_path": "", "smart_motion": null, "source": 0, "source_platform": 0, "stable": { "matrix_path": "", "stable_level": 0, "time_range": { "duration": 0, "start": 0 } }, "team_id": "", "type": "photo", // 图片类型 "video_algorithm": { "algorithms": [], "deflicker": null, "motion_blur_config": null, "noise_reduction": null, "path": "", "quality_enhance": null, "time_range": null }, "width": 1080 // 图片高度 }
注意: 只要创建图片只会创建一个tracks而type类型是video,4个图片都在segments里添加数据
{ "attribute": 0, "flag": 0, "id": "22820104-5F4C-4EE7-AA66-49181365FB11", // 唯一ID,随便用uuid生成就行 "is_default_name": true, "name": "", "segments": [], "type": "video" }
segments的数据
{ "cartoon": false, "clip": { "alpha": 1, "flip": { "horizontal": false, "vertical": false }, "rotation": 0, "scale": { "x": 1, "y": 1 }, "transform": { "x": 0, "y": 0 } }, "common_keyframes": [], "enable_adjust": true, "enable_color_curves": true, "enable_color_match_adjust": false, "enable_color_wheels": true, "enable_lut": true, "enable_smart_color_adjust": false, "extra_material_refs": [ "DC6EC53C-3497-46CE-AF3A-61B002016226", // speeds的id "4B6E427A-A0CE-4CB5-8FDD-625D3C46FFD1", // canvases的id "03559466-D479-45D4-ACE8-5C93C295C32C", // sound_channel_mappings的id "BB3B2A8D-31ED-4AF3-BB2F-389F52FE714D" // vocal_separations的id ], "group_id": "", "hdr_settings": { "intensity": 1, "mode": 1, "nits": 1000 }, "id": "BCC33EDD-DB17-4E5F-9949-B1AEC1D94BF0", // 唯一id "intensifies_audio": false, "is_placeholder": false, "is_tone_modify": false, "keyframe_refs": [], "last_nonzero_volume": 1, "material_id": "13F7F3F1-663C-4F28-8616-489EB3799964", //该id对应videos里的id "render_index": 0, "responsive_layout": { "enable": false, "horizontal_pos_layout": 0, "size_layout": 0, "target_follow": "", "vertical_pos_layout": 0 }, "reverse": false, "source_timerange": { "duration": 1566666, // 图片持续时间 "start": 0 }, "speed": 1, "target_timerange": { "duration": 1566666, // 图片持续时间 "start": 0 // 图片起始时间 }, "template_id": "", "template_scene": "default", "track_attribute": 0, "track_render_index": 0, "uniform_scale": { "on": true, "value": 1 }, "visible": true, "volume": 1 }
以上就是添加图片draft_content.json文件会变化的数据
我们再来观察draft_meta_info.json里的变化情况
draft_fold_path剪映草稿的目录加上草稿的名字
draft_id 唯一id
draft_materials轨道,存放文件的信息,这个咱们待会分析
draft_name这个草稿的名字
draft_root_path剪映草稿的目录
draft_timeline_materials_size_ 草稿的大小 (不重要)
tm_draft_create 时间戳(不重要)
tm_draft_modified 时间戳(不重要)
tm_duration 动画持续时间
而添加图片会放在draft_materials的数组里的第一条轨道的value里,分析一下
{ "create_time": 1699987869, "duration": 5000000, // 动画持续时间5秒 "extra_info": "1.png", // 图片的名字 "file_Path": "C:/Users/lsl/Desktop/tttest/1.png", //图片完整路劲 "height": 1080, // 图片高度 "id": "c7b73489-d34d-4c4a-a0e2-f1bd3f038f39", // 唯一ID "import_time": 1699987869, "import_time_ms": 1699987869000, "item_source": 1, "md5": "", "metetype": "photo", //类型 "roughcut_time_range": { "duration": -1, "start": -1 }, "sub_time_range": { "duration": -1, "start": -1 }, "type": 0, "width": 1080 // 图片宽度 },
4 张图片会添加4个item数据,
以上就是添加图片后draft_meta_info.json里的变化。现在咱们再来分析一下添加音频会添加哪些数据
添加音频
draft_content.json的变化
materials下的audios
materials下的beats
materials下的sound_channel_mappings
materials下的speeds
materials下的vocal_separations
注意:上述我们说到添加图片会在tracks里只会添加一个,而里面的segments会添加4张图片的数据,而音频也同理,也会在tracks里添加一条数据,segments里添加4段音频的数据,注意type类型则再是video了,而是audio
现在我们来分析有哪些数据添加了并且需要动态变化的
audios里的数据
{ "app_id": 0, "category_id": "", "category_name": "local", "check_flag": 1, "duration": 1566666, // 音频时长 "effect_id": "", "formula_id": "", "id": "F8C76CD8-1938-4072-B330-F00BE97D1AAF", // 对应tracks里segments下的material_id "intensifies_path": "", "local_material_id": "699D4C4F-C5A1-44EC-9550-30F5BE027993", // 唯一 "music_id": "5F138CCF-A11F-41C1-98CF-61844FCBD12B", // 唯一 "name": "1.mp3", //音频名字 "path": "C:/Users/lsl/Desktop/音频文件/1.mp3", // 音频完整路劲 "query": "", "request_id": "", "resource_id": "", "search_id": "", "source_platform": 0, "team_id": "", "text_id": "", "tone_category_id": "", "tone_category_name": "", "tone_effect_id": "", "tone_effect_name": "", "tone_speaker": "", "tone_type": "", "type": "extract_music", // 音频类型,默认写死就行 "video_id": "", "wave_points": [] }
beats 的 数据
{ "ai_beats": { "beat_speed_infos": [], "beats_path": "", "beats_url": "", "melody_path": "", "melody_percents": [ 0 ], "melody_url": "" }, "enable_ai_beats": false, "gear": 404, "gear_count": 0, "id": "2745FAB5-636F-4B00-9656-D03A9D7CEE7E", // 对应tracks里segments下的 extra_material_refs里的第二个id "mode": 404, "type": "beats", "user_beats": [], "user_delete_ai_beats": null }
sound_channel_mappings 的数据
{ "audio_channel_mapping": 0, "id": "6FF237FE-075A-4CCD-934B-631A50B6FBC7", // 对应tracks里segments下的 extra_material_refs里的第三个id "is_config_open": false, "type": "none" }
speeds的数据
{ "curve_speed": null, "id": "C6127B0F-128A-4738-96B5-F0C377BA4361",// 对应tracks里segments下的 extra_material_refs里的第一个id "mode": 0, "speed": 1, "type": "speed" }
vocal_separations的数据
{ "choice": 0, "id": "6F67B5E1-F179-41E8-96E2-F60F38BBB095", // 对应tracks里segments下的 extra_material_refs里的第四个id "production_path": "", "time_range": null, "type": "vocal_separation" }
segments 的 数据
{ "cartoon": false, "clip": { "alpha": 1, "flip": { "horizontal": false, "vertical": false }, "rotation": 0, "scale": { "x": 1, "y": 1 }, "transform": { "x": 0, "y": 0 } }, "common_keyframes": [], "enable_adjust": true, "enable_color_curves": true, "enable_color_match_adjust": false, "enable_color_wheels": true, "enable_lut": true, "enable_smart_color_adjust": false, "extra_material_refs": [ "DC6EC53C-3497-46CE-AF3A-61B002016226", // 对应speeds的id "4B6E427A-A0CE-4CB5-8FDD-625D3C46FFD1", // 对应beats的id "03559466-D479-45D4-ACE8-5C93C295C32C", // 对应sound_channel_mappings的id "BB3B2A8D-31ED-4AF3-BB2F-389F52FE714D" // 对应vocal_separations的id ], "group_id": "", "hdr_settings": { "intensity": 1, "mode": 1, "nits": 1000 }, "id": "BCC33EDD-DB17-4E5F-9949-B1AEC1D94BF0", // 唯一 "intensifies_audio": false, "is_placeholder": false, "is_tone_modify": false, "keyframe_refs": [], "last_nonzero_volume": 1, "material_id": "13F7F3F1-663C-4F28-8616-489EB3799964", // audios的id "render_index": 0, "responsive_layout": { "enable": false, "horizontal_pos_layout": 0, "size_layout": 0, "target_follow": "", "vertical_pos_layout": 0 }, "reverse": false, "source_timerange": { "duration": 1566666, // 音频持续时间 "start": 0 }, "speed": 1, "target_timerange": { "duration": 1566666, "start": 0 }, "template_id": "", "template_scene": "default", "track_attribute": 0, "track_render_index": 0, "uniform_scale": { "on": true, "value": 1 }, "visible": true, "volume": 1 }
tracks的数据
{ "attribute": 0, "flag": 0, "id": "62277D1A-A0A6-48A1-89B9-14A6580A5DE9", // 唯一 "is_default_name": true, "name": "", "segments": [], "type": "audio" // 类型 }
以上就是添加音频后draft_content.json的数据变化了,现在我们来看draft_meta_info.json的数据变化
其他数据我们上面在分析添加图片的时候讲过在这里就不讲了,只需要注意draft_materials添加的数据
{ "create_time": 1699987869, // 创建时间 int(time.time()) "duration": 1563333, // 音频时长 "extra_info": "3.mp3", // 音频名字 "file_Path": "C:/Users/lsl/Desktop/音频文件/3.mp3", // 音频完整路劲 "height": 0, // 如果是音频的话,直接写死0 "id": "30df8daf-974a-4a06-b4fd-5f6404892267", "import_time": 1699987869, // int(time.time()) "import_time_ms": 1699987869000, // 导入时间毫秒级 "item_source": 1, "md5": "", "metetype": "music", // 音频类型,写死music "roughcut_time_range": { "duration": 1563333, // 音频时长 "start": -1 }, "sub_time_range": { "duration": -1, "start": -1 }, "type": 0, "width": 0 // 如果是音频的话,直接写死0 }
以上就是添加音频后draft_meta_info.json的变化了,现在分析了数据就可以用代码来创建草稿
思路
先读取,模板。也就是我们一开始创建的
在初始化的时候就读取
def init_data(self): """ 初始化数据 """ self.template_meta_info_path, self.template_meta_content_path = template_path() # 返回两个模版的完整路劲 self.draft_content_template = read_json(self.template_meta_content_path) # 模版1 self.draft_meta_template = read_json(self.template_meta_info_path) # 模版2 self.draft_content_template['id'] = generate_id() # 给模版ID设置唯一id tracks_video_data = tracks() # 创建tracks用于存放图片信息 tracks_video_data['type'] = 'video' # 类型 self.draft_content_template['tracks'].append(tracks_video_data) # 添加到模板里 tracks_audio_data = tracks() # 创建tracks用于存放音频信息 tracks_audio_data['type'] = 'audio' # 类型 self.draft_content_template['tracks'].append(tracks_audio_data) # 添加到模板里 self.draft_meta_template['draft_id'] = generate_id() # 给模版ID设置唯一id self.draft_meta_template[ 'draft_root_path'] = self.base_path # 剪映的草稿路劲 如:D:\\software\\剪映\\JianyingPro Drafts self.draft_meta_template['tm_draft_create'] = int(time.time() * 1000) # draft_meta_info.json创建时间,时间戳 self.draft_meta_template['tm_draft_modified'] = generate_16_digit_timestamp() # 13或16位毫秒级时间戳 self.draft_meta_template['draft_removable_storage_device'] = get_drive_from_path(self.base_path) # 磁盘的驱动器 如"D:" self.draft_meta_template['draft_fold_path'] = self.folder_path.replace('\', '/') # 剪映安装路劲加上草稿名字 如: D:/software/剪映/JianyingPro Drafts/六合八荒唯我独尊 self.draft_meta_template['draft_name'] = self.novel_name # 草稿名字 如:"D:/software/剪映/JianyingPro Drafts/六合八荒唯我独尊"
读取音频文件夹的音频信息。读取音频文件夹里的音频文件信息和图片文件夹里的图片文件信息,用来循环添加数据。之前分析过JSON,有哪些数据变化我也注释出来了,这个需要你们自己往模版里添加
添加完了数据,记得计算一下音频的总时长,将draft_content.json的duration就等于所有音频时间想加,
最后将创建完整的两个模版json数据写入到剪映草稿目录下就行了。
def write_data(self): """ 创建文件,并写入数据 """ # 创建文件夹 os.makedirs(self.folder_path, exist_ok=True) # 创建 draft_meta_info.json with open(self.meta_info_path, 'w', encoding='utf-8') as meta_info_file: json.dump(self.draft_meta_template, meta_info_file, indent=4, ensure_ascii=False) with open(self.content_path, 'w', encoding='utf-8') as content_file: json.dump(self.draft_content_template, content_file, indent=4, ensure_ascii=False)
准备好各个items的模版,有一些唯一id用uuid生成就行了,这些是我写的代码各位可以参考使用。
到这里就结束了。
# utils import base64 import time import uuid import json from PIL import Image from moviepy.editor import * def generate_id(): """ 生成uuid(大写) """ return str(uuid.uuid4()).upper() def read_json(path): """ 加载模板JSON """ try: with open(path, 'r', encoding="utf-8") as template_meta_info_file: info_data = json.load(template_meta_info_file) return info_data except Exception as e: print(f"Error: {e}") return None def process_image(file_path): """ 获取图片信息 """ try: # 提取文件名 file_name = os.path.basename(file_path) # 打开图片文件 with Image.open(file_path) as img: # 获取图片的宽度和高度 width, height = img.size # 宽度、高度、完整路径和文件名 image_info = { 'file_path': file_path, 'file_name': file_name, 'width': width, 'height': height } return image_info except Exception as e: # 处理可能的异常,比如无法打开文件或不是有效的图片文件 print(f"Error processing file {file_path}: {e}") return None def process_images_in_folder(folder_path): """ 返回图片信息以及完整路劲 """ image_info_array = [] # 遍历文件夹中的文件 for root, dirs, files in os.walk(folder_path): for file in files: # 检查文件扩展名,确保它是图片文件 if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tif')): # 获取图片文件的完整路径 image_path = os.path.join(root, file).replace('\', '/') # 处理图片文件 image_info = process_image(image_path) # 将image_info添加到数组中 if image_info: image_info_array.append(image_info) return image_info_array def template_path(): """ :return: 模板草稿的完整路劲 """ # 获取当前文件所在目录的路径 current_folder_path = os.path.dirname(os.path.abspath(__file__)) # 构建 template 文件夹的路径 template_folder_path = os.path.join(current_folder_path, 'templatejson') # 构建 draft_meta_info.json 文件的完整路径 template_meta_info_path = os.path.join(template_folder_path, 'draft_meta_data.json') template_meta_content_path = os.path.join(template_folder_path, 'draft_content_data.json') return template_meta_info_path, template_meta_content_path def process_audio(file_path): """ 获取音频信息 """ try: # 提取文件名 file_name = os.path.basename(file_path) # 读取音频文件 clip = AudioFileClip(file_path) # 获取音频时长 audio_duration = int(clip.duration * 1_000_000) + 3333 # 这里是转成剪映的 audio_info = { 'file_path': file_path, 'file_name': file_name, 'duration': audio_duration, 'filetype': 'audio' } return audio_info except Exception as e: # 处理可能的异常,比如无法打开文件或不是有效的音频文件 print(f"处理文件 {file_path} 时出错:{e}") return None def process_audios_in_folder(folder_path): """ 返回音频信息以及完整路劲 """ audio_info_array = [] # 遍历文件夹中的文件 for root, dirs, files in os.walk(folder_path): for file in files: # 检查文件扩展名,确保它是音频文件 if file.lower().endswith(('.wav', '.mp3', '.ogg', '.aac', '.m4a')): # 获取音频文件的完整路径 audio_path = os.path.join(root, file).replace('\', '/') # 处理音频文件 audio_info = process_audio(audio_path) # 将audio_info添加到数组中 if audio_info: audio_info_array.append(audio_info) return audio_info_array
需要用到的模版代码,我已经将唯一的uuid在导出的时候就生成了
from apps.utils import * def tracks(): return { "attribute": 0, "flag": 0, "id": generate_id(), "is_default_name": True, "name": "", "segments": [], "type": "" } def segment_video(): return { "cartoon": False, "clip": { "alpha": 1.0, "flip": { "horizontal": False, "vertical": False }, "rotation": 0.0, "scale": { "x": 1.0, "y": 1.0 }, "transform": { "x": 0.0, "y": 0.0 } }, "common_keyframes": [], "enable_adjust": True, "enable_color_curves": True, "enable_color_match_adjust": False, "enable_color_wheels": True, "enable_lut": True, "enable_smart_color_adjust": False, "extra_material_refs": [], "group_id": "", "hdr_settings": { "intensity": 1.0, "mode": 1, "nits": 1000 }, "id": generate_id(), "intensifies_audio": False, "is_placeholder": False, "is_tone_modify": False, "keyframe_refs": [], "last_nonzero_volume": 1.0, "material_id": "", "render_index": 0, "responsive_layout": { "enable": False, "horizontal_pos_layout": 0, "size_layout": 0, "target_follow": "", "vertical_pos_layout": 0 }, "reverse": False, "source_timerange": { "duration": 5000000, "start": 0 }, "speed": 1.0, "target_timerange": { "duration": 5000000, "start": 0 }, "template_id": "", "template_scene": "default", "track_attribute": 0, "track_render_index": 0, "uniform_scale": { "on": True, "value": 1.0 }, "visible": True, "volume": 1.0 } def segment_audio(): return { "cartoon": False, "clip": None, "common_keyframes": [], "enable_adjust": False, "enable_color_curves": True, "enable_color_match_adjust": False, "enable_color_wheels": True, "enable_lut": False, "enable_smart_color_adjust": False, "extra_material_refs": [], "group_id": "", "hdr_settings": None, "id": generate_id(), "intensifies_audio": False, "is_placeholder": False, "is_tone_modify": False, "keyframe_refs": [], "last_nonzero_volume": 1.0, "material_id": "", "render_index": 0, "responsive_layout": { "enable": False, "horizontal_pos_layout": 0, "size_layout": 0, "target_follow": "", "vertical_pos_layout": 0 }, "reverse": False, "source_timerange": { "duration": 0, "start": 0 }, "speed": 1.0, "target_timerange": { "duration": 0, "start": 0 }, "template_id": "", "template_scene": "default", "track_attribute": 0, "track_render_index": 0, "uniform_scale": None, "visible": True, "volume": 1.0 } def vocal(): return { "choice": 0, "id": "", "production_path": "", "time_range": None, "type": "vocal_separation" } def videos_items(): return { "aigc_type": "none", "audio_fade": None, "cartoon_path": "", "category_id": "", "category_name": "local", "check_flag": 63487, "crop": { "lower_left_x": 0.0, "lower_left_y": 1.0, "lower_right_x": 1.0, "lower_right_y": 1.0, "upper_left_x": 0.0, "upper_left_y": 0.0, "upper_right_x": 1.0, "upper_right_y": 0.0 }, "crop_ratio": "free", "crop_scale": 1.0, "duration": 10800000000, "extra_type_option": 0, "formula_id": "", "freeze": None, "gameplay": None, "has_audio": False, "height": 0, "id": "", "intensifies_audio_path": "", "intensifies_path": "", "is_ai_generate_content": False, "is_unified_beauty_mode": False, "local_id": "", "local_material_id": "", "material_id": "", "material_name": "", "material_url": "", "matting": { "flag": 0, "has_use_quick_brush": False, "has_use_quick_eraser": False, "interactiveTime": [], "path": "", "strokes": [] }, "media_path": "", "object_locked": None, "origin_material_id": "", "path": "", "picture_from": "none", "picture_set_category_id": "", "picture_set_category_name": "", "request_id": "", "reverse_intensifies_path": "", "reverse_path": "", "smart_motion": None, "source": 0, "source_platform": 0, "stable": { "matrix_path": "", "stable_level": 0, "time_range": { "duration": 0, "start": 0 } }, "team_id": "", "type": "photo", "video_algorithm": { "algorithms": [], "deflicker": None, "motion_blur_config": None, "noise_reduction": None, "path": "", "quality_enhance": None, "time_range": None }, "width": 0 } def speeds_items(): return { "curve_speed": None, "id": "", "mode": 0, "speed": 1.0, "type": "speed" } def sound_items(): return { "audio_channel_mapping": 0, "id": "", "is_config_open": False, "type": "" } def canvases_items(): return { "album_image": "", "blur": 0.0, "color": "", "id": "", "image": "", "image_id": "", "image_name": "", "source_platform": 0, "team_id": "", "type": "canvas_color" } def beats_items(): return { "ai_beats": { "beat_speed_infos": [], "beats_path": "", "beats_url": "", "melody_path": "", "melody_percents": [ 0.0 ], "melody_url": "" }, "enable_ai_beats": False, "gear": 404, "gear_count": 0, "id": "", "mode": 404, "type": "beats", "user_beats": [], "user_delete_ai_beats": None } def audios(): return { "app_id": 0, "category_id": "", "category_name": "local", "check_flag": 1, "duration": 0, "effect_id": "", "formula_id": "", "id": "", "intensifies_path": "", "local_material_id": generate_id(), "music_id": generate_id(), "name": "", "path": "", "query": "", "request_id": "", "resource_id": "", "search_id": "", "source_platform": 0, "team_id": "", "text_id": "", "tone_category_id": "", "tone_category_name": "", "tone_effect_id": "", "tone_effect_name": "", "tone_speaker": "", "tone_type": "", "type": "extract_music", "video_id": "", "wave_points": [] } def draft_materials_items(): return { "create_time": int(time.time()), "duration": 0, "extra_info": "", "file_Path": "", "height": 0, "id": generate_id2(), "import_time": int(time.time()), "import_time_ms": int(time.time()) * 10 ** 3, "item_source": 1, "md5": "", "metetype": "0", "roughcut_time_range": { "duration": -1, "start": -1 }, "sub_time_range": { "duration": -1, "start": -1 }, "type": 0, "width": 0 } def material_animations_items(): return { "animations": [], "id": "", "type": "sticker_animation" }
成果展示一下!