- 影响范围: 🟢 高 - 从零创建了一个完整的 Electron + Vue 3 + FFmpeg 视频处理桌面应用
- 核心变更:
- ✨ 初始化项目配置文件(package.json、vite.config.js、electron-vite.config.js)
- 🎬 实现 Electron 主进程,集成 FFmpeg 视频转换和剪辑功能
- 🖥️ 构建 Vue 3 前端界面,包含首页、格式转换和视频剪辑三个页面
- 🔗 建立 IPC 通信机制,实现渲染进程与主进程的交互
graph TD
subgraph "渲染进程 - Vue 3 前端"
A["Home.vue<br/>首页"] --> B["Convert.vue<br/>格式转换"]
A --> C["Clip.vue<br/>视频剪辑"]
B --> D["selectVideoFiles()<br/>选择视频文件"]
B --> E["startConvert()<br/>发起转换请求"]
C --> F["selectVideoFiles()<br/>选择视频文件"]
C --> G["startClip()<br/>发起剪辑请求"]
end
subgraph "Electron 预加载层"
H["preload.js<br/>contextBridge"]
end
subgraph "主进程 - Electron Main"
I["main.js<br/>createWindow()<br/>创建窗口"]
J["ipcMain.on<br/>'select-video-files'<br/>文件选择对话框"]
K["ipcMain.on<br/>'convert-video'<br/>视频转换处理"]
L["ipcMain.on<br/>'clip-video'<br/>视频剪辑处理"]
K --> M["fluent-ffmpeg<br/>格式转换"]
L --> N["fluent-ffmpeg<br/>视频剪辑"]
end
subgraph "外部依赖"
O["FFmpeg<br/>/opt/homebrew/bin/ffmpeg"]
end
D -.->|"IPC send"| J
E -.->|"IPC send"| K
F -.->|"IPC send"| J
G -.->|"IPC send"| L
M -.-> O
N -.-> O
H -.->|"安全 API 暴露"| A
H -.->|"安全 API 暴露"| B
H -.->|"安全 API 暴露"| C
定义了项目依赖和构建脚本:
| 依赖类型 | 包名 | 版本 | 用途 |
|---|---|---|---|
| 核心框架 | vue | ^3.5.13 | 前端框架 |
| electron | ^41.2.0 | 桌面应用框架 | |
| vue-router | ^4.3.0 | 路由管理 | |
| pinia | ^2.1.7 | 状态管理 | |
| UI 组件 | element-plus | ^2.7.2 | UI 组件库 |
| @element-plus/icons-vue | ^2.3.2 | 图标库 | |
| 视频处理 | fluent-ffmpeg | ^2.1.2 | FFmpeg 封装 |
| ffmpeg-static | ^5.2.0 | FFmpeg 二进制 | |
| file-type | ^20.0.0 | 文件类型检测 | |
| 构建工具 | vite | ^6.0.5 | 构建工具 |
| electron-vite | ^2.3.0 | Electron 构建插件 |
脚本命令:
"dev": "vite"
"build": "vite build"
"electron:dev": "concurrently \"vite\" \"electron electron/main.js\""
"electron:build": "vite build && electron-builder"- 配置 Vue 插件和路径别名
@→/src
- 配置 Electron 三进程构建:
- main: 输出到
dist/electron/main,CJS 格式 - preload: 输出到
dist/electron/preload,CJS 格式 - renderer: 输出到
dist/electron/renderer,支持 Vue 和路径别名
- main: 输出到
标准忽略规则,包括:
- 依赖目录 (
node_modules) - 构建产物 (
dist,out,build) - 日志文件 (
*.log) - 环境变量 (
.env*) - 编辑器配置 (
.vscode,.idea)
核心功能模块:
| 功能 | IPC 事件 | 说明 |
|---|---|---|
| 窗口管理 | - | createWindow() 创建 1200x800 窗口 |
| 文件选择 | select-video-files |
打开文件对话框,支持多选视频 |
| 路径选择 | select-output-path |
打开目录选择对话框 |
| 视频转换 | convert-video |
执行 FFmpeg 格式转换 |
| 视频剪辑 | clip-video |
执行 FFmpeg 视频剪辑 |
视频转换逻辑 (convert-video):
// 支持的参数
{
files: [{ path, name }], // 输入文件列表
outputFormat: 'mp4', // 输出格式
videoCodec: 'libx264', // 视频编码器
videoBitrate: '1000k', // 比特率
resolution: '1920x1080', // 分辨率
frameRate: 30, // 帧率
outputPath: '/path/to/output' // 输出目录
}视频剪辑逻辑 (clip-video):
// 支持的参数
{
files: [{ path, name }], // 输入文件列表
startTime: '00:00:00', // 开始时间 (HH:MM:SS)
endTime: '00:00:30', // 结束时间
outputFormat: 'mp4', // 输出格式
outputPath: '/path/to/output' // 输出目录
}/opt/homebrew/bin/ffmpeg(macOS Homebrew 安装路径)
- 使用
contextBridge暴露安全的electronAPI到渲染进程 - 暴露
window.require以便渲染进程直接使用 Node.js 模块
应用入口,集成:
- Vue 3
- Pinia 状态管理
- Vue Router
- Element Plus UI 组件库
主应用布局:
- 顶部导航栏(首页、格式转换、视频剪辑)
- 主内容区域(
<router-view>) - 底部页脚
路由配置:
| 路径 | 组件 | 功能 |
|---|---|---|
/ |
Home.vue | 首页 |
/convert |
Convert.vue | 格式转换 |
/clip |
Clip.vue | 视频剪辑 |
首页展示:
- 欢迎卡片
- 功能介绍卡片(视频格式转换、视频剪辑)
- 快速导航按钮
表单参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 输出格式 | Select | mp4 | mp4, webm, avi, mkv |
| 视频编码器 | Select | libx264 | H.264, H.265, VP8, VP9 |
| 视频比特率 | Input | 1000k | 例如: 1000k |
| 分辨率 | Select | original | 原始, 1080p, 720p, 480p |
| 帧率 | Number | 30 | 1-60 |
IPC 通信流程:
- 用户点击"选择视频文件" → 发送
select-video-files - 主进程打开文件对话框 → 返回
select-video-files-result - 用户设置参数并点击"开始转换" → 发送
convert-video - 主进程执行转换 → 实时推送
convert-progress - 转换完成 → 推送
convert-complete
表单参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 开始时间 | Input | 00:00:00 | HH:MM:SS 格式 |
| 结束时间 | Input | 00:00:30 | HH:MM:SS 格式 |
| 输出格式 | Select | mp4 | mp4, webm, avi, mkv |
IPC 通信流程:
- 用户点击"选择视频文件" → 发送
select-video-files - 主进程打开文件对话框 → 返回
select-video-files-result - 用户设置剪辑时间和输出路径 → 点击"开始剪辑" → 发送
clip-video - 主进程执行剪辑 → 实时推送
clip-progress - 剪辑完成 → 推送
clip-complete
-
FFmpeg 路径硬编码
- 位置:
electron/main.js第 89、170 行 - 问题: FFmpeg 路径固定为
/opt/homebrew/bin/ffmpeg,仅适用于 macOS Homebrew 环境 - 建议: 应该动态检测 FFmpeg 路径或提供配置选项
- 位置:
-
安全性问题
- 位置:
electron/main.js第 21-22 行 - 问题:
nodeIntegration: true和contextIsolation: false存在安全风险 - 建议: 应启用
contextIsolation,禁用nodeIntegration,通过 preload 脚本暴露必要 API
- 位置:
-
错误处理不完善
- 问题: FFmpeg 转换/剪辑失败时仅输出日志,未给用户详细错误信息
- 建议: 增强错误处理,提供更友好的错误提示
| 测试场景 | 验证点 |
|---|---|
| 文件选择 | 能否正确选择多个视频文件 |
| 格式转换 | 转换不同格式(MP4 → WebM, AVI → MP4) |
| 编码器切换 | H.264、H.265、VP8、VP9 编码器是否正常工作 |
| 分辨率调整 | 1080p、720p、480p 转换是否正确 |
| 视频剪辑 | 指定时间段剪辑是否准确 |
| 批量处理 | 多个文件批量转换/剪辑是否正常 |
| 进度显示 | 进度条和状态信息是否实时更新 |
| 错误处理 | 无效输入、路径不存在等错误情况的处理 |
- 操作系统: 当前配置主要针对 macOS(FFmpeg 路径),需要适配 Windows 和 Linux
- Node.js 版本: 需要支持 ES Modules (
"type": "module") - Electron 版本: ^41.2.0
这是一个从零开始创建的 FFmpeg GUI 视频处理桌面应用,采用现代化的技术栈(Electron + Vue 3 + Vite),实现了视频格式转换和视频剪辑两大核心功能。项目结构清晰,前后端分离,通过 IPC 机制实现通信。但存在 FFmpeg 路径硬编码、安全性配置不当等问题,需要在后续版本中优化。