Python 视频去重混剪脚本提示词(防重复 + 闪黑转场 + 可选指定音频)
请用 Python 编写一个视频混剪脚本,实现以下所有功能。
1. 输入目录结构
根目录由用户指定,例如:./video/
根目录下包含多个子目录,每个子目录代表一种设备/场景类型
脚本自动遍历根目录下所有子目录,并扫描每个子目录中的视频文件(支持 .mp4, .avi, .mov, .mkv 等)。
2. 文案驱动的素材选择
用户输入一段中文文案。
脚本从文案中提取关键主题词:
建议使用 jieba 分词,去除停用词,提取实词作为主题词。
若 jieba 不可用,则退化为简单的字符串包含匹配(不区分大小写)。
将主题词与每个子目录名进行模糊匹配(子目录名包含任一主题词即匹配成功)。
匹配规则:
将所有匹配成功的子目录作为视频来源池。
若无任何匹配,则默认使用所有子目录。
用户也可手动指定使用哪些子目录(作为覆盖选项)。
3. 总时长由音频决定,丢弃原视频音频
用户提供一个音频文件。
脚本读取该音频的时长 T_total(单位:秒)。
最终混剪视频的总时长必须等于 T_total(允许 ±0.05 秒微小误差)。
重要:最终输出视频的音频轨只使用用户提供的这个音频文件,所有原始视频片段的音频将被完全丢弃(不进行任何混音或保留)。
4. 片段级防重复(永久持久化,基于时间区间)
核心规则:同一视频文件可以多次使用,但每次使用的片段时间区间不能重叠。未使用的部分未来可以继续使用。
脚本需维护一个持久化数据库(推荐 SQLite),记录每个视频文件(绝对路径)已被使用过的时间区间列表。
可用空隙计算算法(建议合并):
取出该视频的所有已用区间,按 start 排序。
合并重叠或相邻的区间(允许 0.1 秒容差)。
计算空隙:从 0 到总时长,减去合并后的已用区间,得到一系列可用空隙 [gap_start, gap_end]。
每个空隙的长度 = gap_end - gap_start。
每次运行脚本时:
加载数据库中的所有已用区间。
对于每个视频文件,计算其最大可用片段长度(所有空隙中的最大宽度)。
随机抽取视频时,只考虑那些最大可用片段长度 ≥ 当前所需时长 d_i 的视频。
从候选视频的可用空隙中随机选择一个起始点,使得截取区间 [start, start+d_i] 完全落在空隙内。
如果找不到满足条件的视频,或所有视频的剩余可用总时长(所有空隙长度之和)小于所需片段总时长,则报错退出。
数据库事务机制:
在成功生成最终混剪视频之前,不写入任何新区间记录。
只有当最终视频成功保存到输出路径后,才使用 BEGIN TRANSACTION 批量插入本次使用的所有区间,然后 COMMIT。
若任何步骤失败(如视频损坏、拼接错误),执行 ROLLBACK,保证素材不被浪费。
性能优化:预扫描所有视频的时长,并缓存在数据库的一个辅助表中(例如 video_info(video_path, duration)),避免每次读取视频文件。
5. 片段数量与时长的自动规划
每段视频剪辑的时长取值范围:2 ~ 4 秒(可配置,默认 [2, 4])。
设最终需要生成 K 个片段,每个片段时长 d_i ∈ [2, 4],且总和 = T_total。
推荐使用随机生成 + 比例缩放算法:
估算初始片段数 K = max(1, round(T_total / 3.0))。
生成 K 个 [2,4] 的随机浮点数,求和得 sum_d。
缩放每个时长:d_i = d_i * (T_total / sum_d)。
处理边界:若某个 d_i 超出 [2,4],则裁剪并重新缩放,迭代 2~3 次。
最终微调使总和精确等于 T_total(误差 < 0.01 秒)。
最终确定的 K 和每个 d_i 应打印输出。
6. 剪辑规则(每段视频)
按照上一步规划的片段数量 K 和每个片段的时长 d_i,按顺序逐一从来源池中抽取可用视频。
对每个需要剪辑的片段:
从当前可用的视频候选集中随机选择一个视频(候选集 = 来源池中最大可用片段长度 ≥ d_i 的视频)。
根据该视频的已用区间及总时长,计算出所有可用空隙。
随机选择一个空隙,并在该空隙内随机选取起始点 start,满足 start + d_i ≤ gap_end。
截取片段:clip = VideoFileClip(video_path).subclip(start, start+d_i)。
如果视频文件损坏或截取出错,跳过该视频并重试(最多 10 次),重试仍失败则报错退出。
成功截取后,将本次使用的 (video_path, start, start+d_i) 临时保存在内存列表中(等待最终提交)。
7. 混剪、转场与输出
拼接与转场:
将所有剪辑片段按随机顺序排列。
在每两个相邻片段之间插入一个闪黑转场效果:
创建一个纯黑帧片段(颜色 black),时长为 0.3 ~ 0.8 秒(随机)。
使用 CompositeVideoClip 或 concatenate_videoclips 的 transition 参数(moviepy 支持 crossfadein/out,但闪黑需自定义:可将黑片段与两侧片段叠加,或简单地插入黑片段)。
为简化,可以直接在黑片段前后各加 0.1 秒淡入淡出?不,闪黑就是瞬间黑屏再亮起。建议实现:在片段 A 结尾和片段 B 开头之间插入一个全黑片段 BlackClip,时长随机。若需要平滑,可对黑片段做短暂淡入淡出,但不是必须。
最后一个片段之后不需要加转场。
替换音频:
拼接完成后,将最终视频的音频替换为用户提供的音频文件。使用 final_clip.set_audio(AudioFileClip(audio_path))。
输出格式:
格式:MP4,视频编码 H.264,音频编码 AAC。
输出路径可自定义(例如 ./output/merged_video.mp4);若目录不存在则自动创建。
处理进度:使用 tqdm 显示片段剪辑和拼接进度。
8. 错误处理与日志
如果音频文件不存在或无法读取,报错退出。
如果所有可用视频的剩余可用总时长(所有视频的所有空隙长度之和)小于所需片段总时长,报错并提示需要补充至少多少秒的新素材或新视频。
如果抽取一个片段时重试 10 次仍失败,报错退出。
处理过程中打印关键步骤信息:
音频时长、计划片段数及每段时长列表。
数据库中已记录的视频总数、总已用时长、当前剩余可用总时长。
每个片段抽取时使用的视频路径及截取区间。
处理完成后输出“混剪完成”及输出文件路径,并显示本次新增的区间记录条数。
请根据以上完整提示词生成一个独立、可运行的 Python 脚本。脚本应包含所有必要的函数和主流程,并遵循上述所有规则。
更多推荐



所有评论(0)