当前位置: 首页 > news >正文

视频切割脚本(Python版)

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 moviepy==1.0.3

5.效果展示

视频切割脚本效果演示

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[i+1] 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. 删除了 logger=None,默认会显示 MoviePy 的进度条 # 2. 如果不想看太多杂色信息,可以加上 verbose=False (视版本而定) sub_clip.write_videofile( output_path, codec="libx264", audio_codec="aac", preset="ultrafast", # logger='bar' # 如果你想强制显示条形进度条,取消这行注释 ) 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 moviepy==1.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()
http://www.jsqmd.com/news/1175535/

相关文章:

  • 2026毓典奢品汇|天津黄金回收渠道对比:2026年7月卖金注意事项与正规门店测评汇总 - 奢侈品测评参考
  • ClickBench实战指南:3步构建你的数据库性能评估体系
  • SAP UI5 中有没有类似 Angular Router 的路由机制
  • RS罗德与施瓦茨 SMBV100A 罗德与施瓦茨矢量信号发生器
  • Python 核心英文单词完全学习手册
  • 2026敦煌5天4晚深度专线游 戈壁石窟全域探秘 本土老牌旅行社干货最全攻略 - 互联网科技品牌测评
  • Qwen-Fixed-Chat-Templates:终极修复指南,彻底解决Qwen模型代理循环与KV缓存问题
  • Godot Script-IDE:从基础编辑器到专业开发环境的华丽蜕变
  • H5F:让旧浏览器支持HTML5表单验证的终极解决方案
  • Chopper高级用法:多文件上传、表单提交和复杂API集成实战
  • 2026年7月最新乌鲁木齐宝玑官方售后客服中心地址电话及服务网点分布 - 亨得利钟表维修中心
  • AI 辅助 TypeScript 类型推导:从运行时数据自动生成接口定义
  • Arnis技术深度解析:开源地理数据到Minecraft世界的架构实现
  • 如何快速掌握本草模型:打造专业中文医疗AI助手的完整指南
  • 哪个食堂系统公司服务好
  • 铸造缺陷大盘点:从气孔到缩松,一文看懂铸件“翻车”的N种死法
  • 揭秘AMD处理器底层调试:5个步骤掌握SMUDebugTool核心技巧
  • 2026宁波易奢福衣橱焕新回收大牌鞋服 绝版奢品穿搭高价收 24 小时预约上门交易 - 肉松卷
  • 河南打卡雕塑新趋势,艺术与商业的破局之路
  • RE2-Rust UTF-8 与 Latin-1 编码支持:国际化正则表达式的最佳实践
  • Metric3D:从单张图像实现零样本三维度量重建的终极指南
  • 7-3 自媒体运营分析——图表不会说谎:爆款与扑街的可视化探索分析
  • Frame性能优化技巧:提升用户系统API响应速度的10个方法
  • 基于TPS61170与TM4C129的DC-DC升压转换系统设计
  • 2026年7月最新泰州泰格豪雅官方售后客户服务热线与维修网点地址汇总 - 亨得利官方服务中心
  • 银行核心数据底座国产化规模化落地实战:成都银行20+系统批量迁移与读写分离高可用架构解析
  • MiniMax-M2.7-NVFP4多GPU推理配置指南:Tensor Parallelism实战
  • minimal-json高级技巧:如何优雅修改JSON结构与格式化输出
  • 2026年7月最新广州美度官方售后客服服务电话及地址网点大全 - 亨得利钟表维修中心
  • SavvyCAN:跨平台CAN总线分析的终极解决方案