基于 PyQt6 的专业桌面视频编辑软件,支持多轨道编辑、拖拽操作、实时预览等功能。
# Windows 用户
双击运行: 启动EzCut.bat
# 或使用 Python 脚本
python start.pypython video_editor_qt.py- Python 3.8+
- PyQt6
- OpenCV
- NumPy
- Pillow
pip install PyQt6 opencv-python numpy pillow
# 或
pip install -r requirements_qt.txt- 视频加载与预览: 支持 MP4、AVI、MOV、MKV 等主流视频格式
- 视频剪切: 精确的时间轴剪切,支持多片段选择
- 视频合并: 将多个片段按顺序合并为完整视频
- 拖拽操作: 直观的片段拖拽和重新排序
- 画面控制: 支持画面放大、缩小、移动等操作
- 自动识别: 基于 OpenAI Whisper 的高精度语音识别
- 字幕编辑: 实时编辑字幕文本和时间轴
- 样式定制: 丰富的字幕样式选项(字体、颜色、位置等)
- 自定义字体: 支持安装和使用自定义字体文件
- 格式支持: 导入/导出 SRT 字幕文件
- 现代化 UI: 基于 Tkinter 的清爽界面设计
- 实时预览: 视频播放和字幕同步预览
- 进度显示: 详细的处理进度和状态提示
- 快捷操作: 丰富的快捷键和右键菜单
- 界面框架: Tkinter (Python 标准库)
- 视频处理: OpenCV + MoviePy
- 音频识别: OpenAI Whisper / Faster-Whisper
- 字幕处理: pysrt
- 图像处理: PIL/Pillow
ezcut/
├── main.py # 主程序入口
├── requirements.txt # 依赖包列表
├── config.json # 配置文件
├── src/ # 源代码目录
│ ├── video_processor.py # 视频处理模块
│ ├── subtitle_manager.py# 字幕管理模块
│ ├── gui/ # 用户界面模块
│ │ └── main_window.py # 主窗口界面
│ └── utils/ # 工具模块
│ └── config.py # 配置管理
├── temp/ # 临时文件目录
├── output/ # 输出文件目录
└── fonts/ # 自定义字体目录
- Python 3.8 或更高版本
- Anaconda 或 Miniconda (推荐)
- Windows 10/11, macOS 10.14+, 或 Linux
- 至少 4GB 内存
- 2GB 可用磁盘空间
适用于所有平台,提供最佳兼容性
-
安装 Anaconda 或 Miniconda
-
克隆项目
git clone https://github.com/your-username/ezcut.git
cd ezcut- 自动安装 (Windows)
# 运行安装脚本
install.bat
# 启动程序
run_conda.bat- 自动安装 (macOS/Linux)
# 给脚本执行权限
chmod +x install.sh run_conda.sh
# 运行安装脚本
./install.sh
# 启动程序
./run_conda.sh- 手动安装
# 创建conda环境
conda env create -f environment.yml
# 激活环境
conda activate ezcut
# 运行程序
python main.py- 克隆项目
git clone https://github.com/your-username/ezcut.git
cd ezcut- 创建虚拟环境 (推荐)
python -m venv ezcut_env
# Windows
ezcut_env\Scripts\activate
# macOS/Linux
source ezcut_env/bin/activate- 安装依赖
pip install -r requirements.txt- 运行程序
python main.pyFFmpeg (自动安装):
- conda 环境会自动安装 FFmpeg
- pip 安装需要手动安装 FFmpeg 并添加到 PATH
GPU 加速支持 (可选):
# 在激活的环境中安装
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118-
加载视频
- 方式一:点击
文件→打开视频 - 方式二:直接从文件管理器拖拽视频文件到媒体库(推荐)
- 视频将在预览窗口中显示
- 方式一:点击
-
生成字幕
- 点击
字幕→自动识别字幕 - 等待 AI 模型处理完成
- 字幕将显示在右侧编辑面板
- 点击
-
编辑字幕
- 在字幕列表中选择要编辑的条目
- 修改文本内容和时间轴
- 点击
更新保存修改
-
视频剪辑
- 使用时间轴选择要保留的片段
- 拖拽调整片段顺序
- 预览剪辑效果
-
导出结果
- 点击
文件→导出视频 - 选择输出路径和格式
- 等待处理完成
- 点击
本项目支持完整的拖拽操作,让媒体文件管理更加便捷:
- 文件拖拽到媒体库:从文件管理器直接拖拽媒体文件到媒体库面板
- 媒体库到时间轴:从媒体库拖拽文件到时间轴进行编辑
- 多文件同时拖拽:支持批量导入多个文件
- 实时视觉反馈:拖拽过程中提供界面提示和状态反馈
详细的拖拽功能使用方法请参考:拖拽功能使用指南
字幕样式定制:
- 字体选择和大小调整
- 颜色和背景设置
- 位置和对齐方式
- 描边和阴影效果
自定义字体安装:
- 点击
字幕→安装字体 - 选择 TTF 或 OTF 字体文件
- 字体将自动添加到可用列表
批量处理:
- 支持多个视频文件的批量字幕生成
- 批量应用相同的剪辑规则
- 自动化的输出文件命名
本项目在开发过程中参考了以下优秀的开源项目:
- 项目地址: https://github.com/mli/autocut
- 参考内容:
- Whisper 模型的加载和使用方法
- 视频音频提取和处理流程
- SRT 字幕文件的生成和解析
- 视频剪切和合并的实现思路
- 致谢: 感谢 AutoCut 项目提供的字幕识别和视频处理的优秀实现方案
- 项目地址: https://github.com/FutureUniant/Tailor
- 参考内容:
- 视频处理的整体架构设计
- 用户界面的布局和交互设计
- 视频优化和处理算法的思路
- 多媒体文件的处理方式
- 致谢: 感谢 Tailor 项目在视频编辑软件设计方面的启发
-
参考内容:
- 视频拖拽到媒体库的实现思路
- 媒体库到时间轴的拖拽操作设计
- Tkinter 拖拽事件处理机制
- 视频编辑软件的用户交互设计
-
借鉴实现:
- 跨平台拖拽支持: 使用
tkinterdnd2库实现跨平台文件拖拽功能 - 多文件拖拽: 支持同时拖拽多个媒体文件到媒体库
- 拖拽视觉反馈: 实现拖拽进入、移动、离开时的界面反馈
- 文件格式验证: 在拖拽时验证文件类型和格式支持
- 时间轴拖拽: 从媒体库拖拽文件到时间轴的交互设计
- 跨平台拖拽支持: 使用
-
核心技术实现:
# 媒体库拖拽支持 (借鉴iVideo项目架构) def setup_drag_drop(self): import tkinterdnd2 as tkdnd # 注册拖拽目标 self.media_canvas.drop_target_register(tkdnd.DND_FILES) # 绑定拖拽事件 self.media_canvas.dnd_bind('<<DropEnter>>', self.on_drag_enter) self.media_canvas.dnd_bind('<<DropPosition>>', self.on_drag_motion) self.media_canvas.dnd_bind('<<DropLeave>>', self.on_drag_leave) self.media_canvas.dnd_bind('<<Drop>>', self.on_drop) def on_drag_enter(self, event): # 拖拽进入时的视觉反馈 self.media_canvas.configure(bg='lightblue') return 'copy' def on_drop(self, event): # 处理拖拽文件 files = event.data.split() if hasattr(event.data, 'split') else [event.data] for file_path in files: if self.validate_media_file(file_path): self.add_media_file(file_path) # 时间轴拖拽支持 def setup_timeline_drag_drop(self): self.timeline_canvas.drop_target_register(tkdnd.DND_FILES) self.timeline_canvas.dnd_bind('<<Drop>>', self.on_timeline_drop) def on_timeline_drop(self, event): # 计算拖拽位置和轨道 x, y = self.timeline_canvas.canvasx(event.x), self.timeline_canvas.canvasy(event.y) track_index = self.get_track_at_position(y) time_position = self.pixel_to_time(x) self.add_clip_to_timeline(event.data, track_index, time_position)
-
拖拽功能特性:
- 支持从文件管理器直接拖拽文件到媒体库
- 支持媒体库内文件拖拽到时间轴
- 拖拽过程中提供实时预览和位置指示
- 自动检测拖拽目标区域和有效性
- 支持多种媒体格式的拖拽导入
-
致谢: 感谢 iVideo 项目在视频拖拽操作实现方面的参考价值
- 技术文档: Python 官方 Tkinter.dnd 模块文档
- 参考内容:
- Tkinter 原生拖拽支持的使用方法
- 拖拽事件的生命周期管理
- 跨组件拖拽的实现技巧
- 拖拽数据的序列化和传输
- 实现要点:
- 使用
tkinter.dnd模块提供的拖拽框架 - 实现
dnd_accept、dnd_enter、dnd_leave、dnd_commit方法 - 处理拖拽过程中的鼠标事件和位置计算
- 提供拖拽过程中的用户界面反馈
- 使用
- 视频片段管理器界面
- 字幕样式编辑器
- 更多视频格式支持
- 性能优化和内存管理
- 视频特效和滤镜
- 音频处理和混音
- 多语言界面支持
- 插件系统架构
- 基于深度学习的智能剪辑
- 云端处理和协作功能
- 移动端应用开发
- 商业版本功能扩展
欢迎提交 Issue 和 Pull Request 来帮助改进项目!
- Fork 本项目
- 创建功能分支:
git checkout -b feature/new-feature - 提交更改:
git commit -am 'Add new feature' - 推送分支:
git push origin feature/new-feature - 创建 Pull Request
- 遵循 PEP 8 Python 代码规范
- 添加适当的注释和文档字符串
- 编写单元测试覆盖新功能
- 确保代码通过现有测试
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- 项目主页: https://github.com/your-username/ezcut
- 问题反馈: https://github.com/your-username/ezcut/issues
- 邮箱: [email protected]
特别感谢以下项目和技术:
- OpenAI Whisper - 强大的语音识别模型
- MoviePy - 优秀的视频处理库
- OpenCV - 计算机视觉处理库
- AutoCut 和 Tailor 项目的开源贡献
EzCut - 让视频剪辑变得简单高效! 🎬✨