视频切割脚本(Python版) 📅 2026/7/12 18:15:24 1.脚本用途将一个长视频按固定时长进行切分2.使用步骤保存脚本将下方的 Python 代码保存为一个 .py 文件例如 split_video.py放置视频将你想要切割的 .mp4 视频文件和这个 split_video.py 脚本放在同一个文件夹下请确保该文件夹内只有一个 .mp4 文件脚本会自动处理找到第一个运行脚本在该文件夹路径下打开终端或命令行输入 python split_video.py 并回车脚本便会自动开始工作3.脚本逻辑说明配置区域脚本开头定义了三个关键参数可根据需求自行修改①SEGMENT_MINUTES 3定义每个标准片段的时长这里是3分钟②MERGE_THRESHOLD 120定义合并阈值单位是秒如果最后一段视频小于120s就会将最后一段合并到前一段中③output_dir定义了输出文件夹的名称默认为 output_segments计算分段点①初步切分首先脚本会计算视频总时长然后按照 SEGMENT_MINUTES 生成一个初步的切割时间点列表。例如一个10分钟的视频会生成 [ 0 , 180 , 360 , 540 ]秒这几个切割点②智能判断计算最后一段的实际时长③合并如果最后一段的时长MERGE_THRESHOLD脚本就会从切割点列表中移除最后一个点执行切割循环①遍历最终确定的切割点列表使用 moviepy 的 subclip 方法逐一截取视频片段②每个片段都会被保存为 原文件名_part_01.mp4、原文件名_part_02.mp4 的格式③脚本还内置了简单的重试机制和内存清理gc.collect()以增强处理的稳定性4.前置环境准备①安装 Python 并完成环境配置②安装依赖库该脚本依赖强大的 moviepy 库来处理视频请在终端或命令行中运行以下命令进行安装pip install moviepy注意根据脚本内的错误提示如果遇到版本兼容性问题可以尝试安装特定版本、pip install moviepy1.0.35.效果展示视频切割脚本效果演示6.源码展示import os import gc import time from moviepy.editor import VideoFileClip def split_video_smart_merge(): # --- 配置区域 --- SEGMENT_MINUTES 3 # 正常每段时长3分钟 MERGE_THRESHOLD 120 # 【关键】合并阈值120秒2分钟。若尾段小于此值则合并 current_dir os.path.dirname(os.path.abspath(__file__)) output_dir os.path.join(current_dir, output_segments) if not os.path.exists(output_dir): os.makedirs(output_dir) video_files [f for f in os.listdir(current_dir) if f.endswith(.mp4)] if not video_files: print(错误未找到 .mp4 视频文件) return video_path os.path.join(current_dir, video_files[0]) print(f正在处理: {video_files[0]}) # 获取总时长 try: temp_clip VideoFileClip(video_path) total_duration temp_clip.duration temp_clip.close() except Exception as e: print(f读取视频失败: {e}) return segment_duration SEGMENT_MINUTES * 60 # --- 核心逻辑计算分段点 --- # 1. 先按标准3分钟切分 cuts list(range(0, int(total_duration), segment_duration)) # 2. 检查最后一段是否太短 if len(cuts) 1: last_segment_duration total_duration - cuts[-1] if last_segment_duration MERGE_THRESHOLD: print(f检测到最后一段时长为 {last_segment_duration:.1f}秒 (小于{MERGE_THRESHOLD}秒)) print(f策略将最后一段合并到第 {len(cuts)-1} 段中。) cuts.pop() else: print(f最后一段时长 {last_segment_duration:.1f}秒保持独立。) print(f最终计划切割为 {len(cuts)} 个片段。开始处理...\n) # --- 执行切割循环 --- for i in range(len(cuts)): start_time cuts[i] # 如果是最后一段结束时间就是视频总时长否则是下一个切割点 if i len(cuts) - 1: end_time total_duration else: end_time cuts[i1] part_num i 1 output_filename f{os.path.splitext(video_files[0])[0]}_part_{part_num:02d}.mp4 output_path os.path.join(output_dir, output_filename) print(f--- 正在处理第 {part_num}/{len(cuts)} 段 ({start_time}s - {end_time}s) ---) success False retry_count 0 # 重试机制 while not success and retry_count 3: try: sub_clip VideoFileClip(video_path).subclip(start_time, end_time) # 【修改点】 # 1. 删除了 loggerNone默认会显示 MoviePy 的进度条 # 2. 如果不想看太多杂色信息可以加上 verboseFalse (视版本而定) sub_clip.write_videofile( output_path, codeclibx264, audio_codecaac, presetultrafast, # loggerbar # 如果你想强制显示条形进度条取消这行注释 ) sub_clip.close() success True except Exception as e: retry_count 1 error_msg str(e) # 简单的过滤避免报错信息太长刷屏 if unexpected keyword in error_msg: print(f ⚠️ 版本不兼容错误请尝试运行: pip install moviepy1.0.3) return # 直接退出因为重试也没用 print(f ⚠️ 处理失败 (尝试 {retry_count}/3): {error_msg[:80]}...) gc.collect() time.sleep(2) if success: print(f ✅ 成功保存: {output_filename}\n) else: print(f ❌ 最终失败: {output_filename}\n) # 每一段处理完强制休息并清理内存 gc.collect() time.sleep(1) print(\n所有任务已完成请在 output_segments 文件夹查看结果。) if __name__ __main__: split_video_smart_merge()