Skip to content

foxboolean/ffmpegGUI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

1. 高层摘要 (TL;DR)

  • 影响范围: 🟢 - 从零创建了一个完整的 Electron + Vue 3 + FFmpeg 视频处理桌面应用
  • 核心变更:
    • ✨ 初始化项目配置文件(package.json、vite.config.js、electron-vite.config.js)
    • 🎬 实现 Electron 主进程,集成 FFmpeg 视频转换和剪辑功能
    • 🖥️ 构建 Vue 3 前端界面,包含首页、格式转换和视频剪辑三个页面
    • 🔗 建立 IPC 通信机制,实现渲染进程与主进程的交互

2. 可视化概览 (代码与逻辑映射)

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
Loading

3. 详细变更分析

📦 配置文件与依赖

package.json (新建)

定义了项目依赖和构建脚本:

依赖类型 包名 版本 用途
核心框架 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"

vite.config.js (新建)

  • 配置 Vue 插件和路径别名 @/src

electron-vite.config.js (新建)

  • 配置 Electron 三进程构建:
    • main: 输出到 dist/electron/main,CJS 格式
    • preload: 输出到 dist/electron/preload,CJS 格式
    • renderer: 输出到 dist/electron/renderer,支持 Vue 和路径别名

.gitignore (新建)

标准忽略规则,包括:

  • 依赖目录 (node_modules)
  • 构建产物 (dist, out, build)
  • 日志文件 (*.log)
  • 环境变量 (.env*)
  • 编辑器配置 (.vscode, .idea)

⚙️ Electron 主进程

electron/main.js (新建 - 230 行)

核心功能模块:

功能 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' // 输出目录
}

⚠️ 注意: FFmpeg 路径硬编码为 /opt/homebrew/bin/ffmpeg(macOS Homebrew 安装路径)

electron/preload.js (新建)

  • 使用 contextBridge 暴露安全的 electronAPI 到渲染进程
  • 暴露 window.require 以便渲染进程直接使用 Node.js 模块

🎨 Vue 前端应用

src/main.js (新建)

应用入口,集成:

  • Vue 3
  • Pinia 状态管理
  • Vue Router
  • Element Plus UI 组件库

src/App.vue (新建)

主应用布局:

  • 顶部导航栏(首页、格式转换、视频剪辑)
  • 主内容区域(<router-view>
  • 底部页脚

src/router/index.js (新建)

路由配置:

路径 组件 功能
/ Home.vue 首页
/convert Convert.vue 格式转换
/clip Clip.vue 视频剪辑

src/views/Home.vue (新建)

首页展示:

  • 欢迎卡片
  • 功能介绍卡片(视频格式转换、视频剪辑)
  • 快速导航按钮

src/views/Convert.vue (新建 - 375 行)

表单参数:

参数 类型 默认值 说明
输出格式 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 通信流程:

  1. 用户点击"选择视频文件" → 发送 select-video-files
  2. 主进程打开文件对话框 → 返回 select-video-files-result
  3. 用户设置参数并点击"开始转换" → 发送 convert-video
  4. 主进程执行转换 → 实时推送 convert-progress
  5. 转换完成 → 推送 convert-complete

src/views/Clip.vue (新建 - 384 行)

表单参数:

参数 类型 默认值 说明
开始时间 Input 00:00:00 HH:MM:SS 格式
结束时间 Input 00:00:30 HH:MM:SS 格式
输出格式 Select mp4 mp4, webm, avi, mkv

IPC 通信流程:

  1. 用户点击"选择视频文件" → 发送 select-video-files
  2. 主进程打开文件对话框 → 返回 select-video-files-result
  3. 用户设置剪辑时间和输出路径 → 点击"开始剪辑" → 发送 clip-video
  4. 主进程执行剪辑 → 实时推送 clip-progress
  5. 剪辑完成 → 推送 clip-complete

4. 影响与风险评估

⚠️ 潜在问题

  1. FFmpeg 路径硬编码

    • 位置: electron/main.js 第 89、170 行
    • 问题: FFmpeg 路径固定为 /opt/homebrew/bin/ffmpeg,仅适用于 macOS Homebrew 环境
    • 建议: 应该动态检测 FFmpeg 路径或提供配置选项
  2. 安全性问题

    • 位置: electron/main.js 第 21-22 行
    • 问题: nodeIntegration: truecontextIsolation: false 存在安全风险
    • 建议: 应启用 contextIsolation,禁用 nodeIntegration,通过 preload 脚本暴露必要 API
  3. 错误处理不完善

    • 问题: 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

5. 总结

这是一个从零开始创建的 FFmpeg GUI 视频处理桌面应用,采用现代化的技术栈(Electron + Vue 3 + Vite),实现了视频格式转换和视频剪辑两大核心功能。项目结构清晰,前后端分离,通过 IPC 机制实现通信。但存在 FFmpeg 路径硬编码、安全性配置不当等问题,需要在后续版本中优化。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors