博客 / 詳情

返回

告別命令行!我用 Electron + React 開發了一款 FFmpeg 可視化工具

告別命令行!我用 Electron + React 開發了一款 FFmpeg 可視化工具

視頻處理不應該這麼複雜。FFmpeg Studio 讓每個人都能輕鬆處理視頻和音頻。

前言

作為開發者,我們經常需要處理視頻和音頻文件:轉換格式、裁剪片段、提取音頻、添加水印……

雖然 FFmpeg 是最強大的多媒體處理工具,但它的命令行參數讓很多人望而卻步:

ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c:v libx264 -c:a aac -strict experimental output.mp4

能不能有一個簡單直觀的界面,讓 FFmpeg 變得人人可用?

於是,我開發了 FFmpeg Studio —— 一款現代化的跨平台桌面視頻處理工具。

項目介紹

FFmpeg Studio 是一個基於 Electron + React + TypeScript 的桌面應用,為 FFmpeg 提供了一個簡潔美觀的可視化界面。

image.png

核心特性

功能 描述
🎬 格式轉換 支持 MP4、MKV、AVI、MOV、WebM 等主流格式互轉
✂️ 視頻剪輯 可視化時間軸裁剪、畫面裁剪、自動分段、多視頻合併
🎵 音頻提取 從視頻中提取音頻,支持 MP3、AAC、WAV、FLAC 等格式
💧 水印添加 支持文字/圖片水印,自定義位置、大小、透明度
📝 字幕處理 嵌入或燒錄字幕,支持樣式自定義
📡 流媒體下載 下載 M3U8/HLS 流媒體視頻
🖼️ 工具箱 視頻截圖、批量幀提取、GIF 動圖製作
🌍 多語言 支持中文和英文界面切換

亮點功能

1. 可視化時間軸編輯

告別手動計算時間戳!拖動時間軸即可精確選擇裁剪範圍,支持關鍵幀吸附,確保無損剪輯。

2. 實時進度反饋

所有任務都有實時進度條和狀態顯示,支持多任務隊列管理和一鍵取消。

3. 智能預設

針對不同場景提供智能預設:

  • 高質量:適合存檔和專業用途
  • 平衡:質量與體積的最佳平衡
  • 小體積:適合網絡分享和移動設備
4. 拖拽操作

支持拖拽文件到窗口直接處理,也支持拖拽調整視頻合併順序。

技術架構

作為一個技術項目,FFmpeg Studio 採用了現代化的技術棧:

┌─────────────────────────────────────────────┐
│                  Electron                    │
│  ┌─────────────────────────────────────┐    │
│  │           React Frontend             │    │
│  │  ┌─────────┐ ┌─────────┐ ┌───────┐  │    │
│  │  │  Pages  │ │  Stores │ │ Hooks │  │    │
│  │  └─────────┘ └─────────┘ └───────┘  │    │
│  │         Tailwind CSS + Lucide        │    │
│  └─────────────────────────────────────┘    │
│                     ↕ IPC                    │
│  ┌─────────────────────────────────────┐    │
│  │           Main Process               │    │
│  │  ┌─────────────────────────────┐    │    │
│  │  │      FFmpeg Wrapper         │    │    │
│  │  │   (fluent-ffmpeg + static)  │    │    │
│  │  └─────────────────────────────┘    │    │
│  └─────────────────────────────────────┘    │
└─────────────────────────────────────────────┘

技術棧

  • 前端框架: React 18 + TypeScript
  • 桌面框架: Electron 28
  • 樣式方案: Tailwind CSS
  • 狀態管理: Zustand(輕量級,無 Redux 的繁瑣)
  • 構建工具: Vite(開發體驗極佳)
  • 媒體處理: fluent-ffmpeg + ffmpeg-static

為什麼選擇這套技術棧?

  1. TypeScript: 類型安全,減少運行時錯誤,提升開發效率
  2. Zustand: 相比 Redux 更簡潔,學習成本低,性能優秀
  3. Tailwind CSS: 原子化 CSS,快速構建美觀界面
  4. Vite: 極速的開發服務器和熱更新
  5. ffmpeg-static: 內置 FFmpeg 二進制文件,用户無需額外安裝

項目結構

ffmpeg-studio/
├── electron/           # Electron 主進程
│   ├── main.ts        # 窗口管理、IPC 處理
│   ├── preload.ts     # 安全的 API 暴露
│   └── ffmpeg/        # FFmpeg 操作封裝
├── src/               # React 前端
│   ├── components/    # 可複用組件
│   ├── pages/         # 頁面組件
│   ├── stores/        # Zustand 狀態
│   ├── hooks/         # 自定義 Hooks
│   └── locales/       # i18n 翻譯
└── ...

快速開始

方式一:下載安裝包

前往 GitHub Releases 下載適合你係統的安裝包:

  • macOS: .dmg
  • Windows: .exe
  • Linux: .AppImage

方式二:從源碼構建

# 克隆項目
git clone https://github.com/igo9go/ffmpeg-studio.git
cd ffmpeg-studio

# 安裝依賴
npm install

# 開發模式
npm run dev

# 打包
npm run electron:build

使用場景

場景 1:視頻格式轉換

收到一個 .mkv 文件但播放器不支持?拖進來,選擇 MP4,一鍵轉換。

場景 2:提取視頻中的音頻

想把視頻裏的背景音樂提取出來?選擇音頻格式,秒級完成。

場景 3:裁剪視頻片段

只需要視頻中的一小段?拖動時間軸選擇範圍,無需記憶複雜的時間參數。

場景 4:批量截圖

需要從視頻中提取多張截圖做封面?設置間隔時間,批量導出。

場景 5:製作 GIF

想把精彩片段做成動圖分享?選擇時間範圍,一鍵生成 GIF。

場景 6:下載直播回放

遇到 M3U8 格式的直播回放?粘貼地址,自動下載合併。

開發心得

1. Electron IPC 通信設計

為了安全和解耦,採用了嚴格的 IPC 通信模式:

// preload.ts - 安全暴露 API
contextBridge.exposeInMainWorld('electronAPI', {
  convert: (options) => ipcRenderer.invoke('ffmpeg:convert', options),
  onProgress: (callback) => {
    const subscription = (_event, data) => callback(data)
    ipcRenderer.on('ffmpeg:progress', subscription)
    return () => ipcRenderer.removeListener('ffmpeg:progress', subscription)
  }
})

2. 任務隊列管理

使用 Zustand 實現任務隊列,支持進度追蹤和取消:

// taskStore.ts
const useTaskStore = create((set) => ({
  tasks: [],
  addTask: (task) => set((state) => ({
    tasks: [...state.tasks, task]
  })),
  updateTask: (id, updates) => set((state) => ({
    tasks: state.tasks.map(t => t.id === id ? {...t, ...updates} : t)
  }))
}))

3. 國際化方案

採用輕量級的自定義 i18n 方案,無需引入額外依賴:

// useTranslation.ts
export function useTranslation() {
  const { settings } = useSettingsStore()
  return settings.language === 'en' ? en : zh
}

未來計劃

  • [ ] 🎨 更多視頻濾鏡(調色、模糊、鋭化)
  • [ ] 📊 視頻壓縮預估(預測輸出大小)
  • [ ] 🔄 批量處理模式
  • [ ] 🎵 音頻波形可視化
  • [ ] 📱 移動端適配(Capacitor)
  • [ ] 🔌 插件系統

寫在最後

FFmpeg Studio 是一個完全開源的項目,代碼託管在 GitHub:

🔗 GitHub: https://github.com/igo9go/ffmpeg-studio

如果這個項目對你有幫助,歡迎:

  • ⭐ 給項目 Star
  • 🐛 提交 Issue 反饋問題
  • 🔧 提交 PR 貢獻代碼
  • 📢 分享給需要的朋友

讓視頻處理變得簡單,從 FFmpeg Studio 開始!


技術棧:Electron + React + TypeScript + Tailwind CSS

開源協議:MIT


相關鏈接

  • GitHub 倉庫
  • 下載地址
  • 問題反饋

如果你也在開發 Electron 應用,歡迎在評論區交流!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.