使用前请确保安装必要的 Python 库,例如使用以下命令安装:
pip install pyJianYingDraft
以下是完整的脚本示例,用于根据主视频创建剪映草稿,删除指定时间段,添加镜头视频,并保存到草稿文件夹。
import pyJianYingDraft as draft
from pyJianYingDraft import trange, ClipSettings, tim
from typing import *
try:
from xbot.app.logging import trace as print
except:
from xbot import print
def create_jianying_draft_from_clips(draft_name, main_video_path, delete_ranges, lens_info_dict, draft_folder_path):
"""
title: 基于主视频删减片段并插入镜头生成剪映草稿
description: 根据主视频 %main_video_path% 创建剪映草稿,删除指定时间段 %delete_ranges%,添加镜头视频 %lens_info_dict%,并保存到草稿文件夹 %draft_folder_path%。
inputs:
- draft_name (str): 草稿项目名称,eg: "我的视频草稿"
- main_video_path (file): 主视频文件路径,eg: "C:/videos/main.mp4"
- delete_ranges (list): 需要删除的时间段列表,格式 [("开始时间","结束时间")], eg: [("00:00:01,640","00:00:02,640")]
- lens_info_dict (dict): 镜头视频信息字典,格式 {"镜头名":[视频路径,开始时间]}, eg: {"镜头 A":["C:/lens.mp4","00:00:01,640"]}
- draft_folder_path (folder): 剪映草稿文件夹路径,eg: "D:/JianyingPro Drafts"
outputs:
- None
"""
# 检查输入参数
if not draft_name or not isinstance(draft_name, str):
raise ValueError("草稿名称不能为空且必须为字符串")
if not main_video_path:
raise ValueError("主视频路径不能为空")
if not (delete_ranges, ):
ValueError()
(lens_info_dict, ):
ValueError()
draft_folder_path:
ValueError()
():
:
h, m, s_ms = time_str.replace(, ).split()
Exception e:
ValueError()
():
script.add_track(draft.TrackType.video, )
parsed_deletes = []
start_str, end_str delete_ranges:
start = tim(_convert_time(start_str))
end = tim(_convert_time(end_str))
start >= end:
ValueError()
parsed_deletes.append((start, end))
parsed_deletes.sort(key= x: x[])
video_material = draft.VideoMaterial(main_video_path)
total_duration = video_material.duration
keep_ranges = []
prev_end =
delete_start, delete_end parsed_deletes:
delete_start > prev_end:
keep_ranges.append((prev_end, delete_start))
prev_end = (prev_end, delete_end)
prev_end < total_duration:
keep_ranges.append((prev_end, total_duration))
current_start =
keep_start, keep_end keep_ranges:
keep_start >= keep_end:
segment = draft.VideoSegment(
video_material,
target_timerange=trange(current_start, keep_end - keep_start),
source_timerange=trange(keep_start, keep_end - keep_start)
)
script.add_segment(segment, )
current_start += (keep_end - keep_start)
():
lens_name, lens_info lens_info_dict.items():
(lens_info) != :
ValueError()
lens_video_path, lens_start_time = lens_info
:
lens_video_material = draft.VideoMaterial(lens_video_path)
Exception e:
ValueError()
start_time = tim(_convert_time(lens_start_time))
script.add_track(draft.TrackType.video, track_name=lens_name, relative_index=)
lens_segment = draft.VideoSegment(
lens_video_material,
trange(start_time, lens_video_material.duration),
clip_settings=ClipSettings(
scale_x=main_mat.width / lens_video_material.width,
scale_y=main_mat.height / lens_video_material.height,
)
)
script.add_segment(lens_segment, lens_name)
:
draft_folder = draft.DraftFolder(draft_folder_path)
main_mat = draft.VideoMaterial(main_video_path)
script = draft_folder.create_draft(
draft_name,
main_mat.width,
main_mat.height,
)
_add_main_video_segments(script, main_video_path, delete_ranges)
_add_lens_videos(script, lens_info_dict, main_mat)
script.save()
()
Exception e:
Exception()
draft_name =
main_video_path =
delete_ranges = [(, ), (, )]
lens_info_dict = {
: [, ],
: [, ]
}
draft_folder_path =
create_jianying_draft_from_clips(draft_name, main_video_path, delete_ranges, lens_info_dict, draft_folder_path)

