FFmpeg GUI - Tauri Edition
July 17, 2026 · View on GitHub
A beautiful, modern GUI for FFmpeg video processing built with Tauri 2.x, Rust, and React. Trim videos, burn subtitles, and process media with ease.
✨ Features
- Video Trimming - Visually select start and end times with an interactive timeline
- Subtitle Burning - Permanently embed subtitles into videos
- Real-time Progress - Live progress tracking during video processing
- Process Cancellation - Stop processing at any time; reliably kills the ffmpeg process tree (including Windows)
- Quality-first export - Stream-copies whenever possible (trim without filters, multi-cut without crop, merge of matching sources); re-encodes only when filters or incompatible inputs require it
- Native Performance - Built with Rust and Tauri for blazing-fast performance
- Cross-platform - Works on Windows, macOS, and Linux
- System FFmpeg - Uses your system's FFmpeg installation (no bundled binaries)
- Startup Validation - Automatically checks for FFmpeg availability
- Window Close Protection - Prevents accidental closure during processing
Engineering notes
- REFACTOR_OPPORTUNITIES.md — architecture map + remaining refactor inventory (post cancel/quality work)
- CANCEL_AND_QUALITY_FIX.md — cancel orphan bug + quality-first encode paths (issue, root cause, fix, verification)
- HARD_RESET_FIX_EXPLAINED.md — Windows 11 hard-reset / hot-path mitigations
🚀 Quick Start
Prerequisites
-
FFmpeg and FFprobe must be installed and available in your system PATH:
- Windows: Download from ffmpeg.org and add to PATH
- macOS:
brew install ffmpeg - Linux:
sudo apt install ffmpeg
-
Development Dependencies:
- Node.js 18+ and npm
- Rust 1.77.2+ (install from rustup.rs)
Linux System Dependencies
On Linux, install these system libraries before building:
sudo apt update
sudo apt install -y \
libwebkit2gtk-4.1-dev \
build-essential \
curl wget file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
pkg-config
Installation
# Clone the repository
git clone <your-repo-url>
cd ffmpeg-gui
# Install dependencies
npm install
# Start development server
npm run dev
🛠️ Development
Available Scripts
npm run dev- Start Tauri development server with hot reloadnpm run build- Build production installernpm run dev:vite- Start Vite dev server only (for frontend development)npm run lint- Run ESLintnpm run type-check- Run TypeScript type checking
Project Structure
ffmpeg-gui/
├── src/ # React frontend
│ ├── components/ # React components
│ │ ├── FileSelector.tsx # Video/subtitle file selection
│ │ ├── VideoPreview.tsx # Video player with preview
│ │ ├── Timeline.tsx # Interactive trim timeline
│ │ ├── ProcessingPanel.tsx # Export controls & progress
│ │ └── ErrorAlert.tsx # Error display
│ ├── lib/
│ │ └── tauri-api.ts # Tauri API wrapper
│ ├── store/
│ │ └── useVideoStore.ts # Zustand state management
│ └── types/ # TypeScript type definitions
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── commands/ # Tauri command handlers
│ │ │ ├── dialog.rs # File selection dialogs
│ │ │ ├── video.rs # Duration & availability checks
│ │ │ └── process.rs # FFmpeg processing & cancellation
│ │ ├── state.rs # Job tracking state
│ │ └── lib.rs # Main entry point
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri configuration
└── package.json # Node dependencies
📖 Usage
- Select Video: Click "Select Video File" and choose your input video
- Trim (Optional): Drag the timeline handles or enter precise times
- Add Subtitles (Optional): Click "Select Subtitle File" to burn subtitles
- Choose Output: Click "Select output location" to choose where to save
- Process: Click "Start Processing" to begin
- Monitor Progress: Watch the progress bar update in real-time
- Cancel Anytime: Click "Cancel Processing" to stop if needed
Supported Formats
Video Input: MP4, AVI, MOV, MKV, WebM, FLV Subtitle Input: SRT, VTT, ASS, SSA Video Output: MP4, AVI, MOV, MKV, WebM
🏗️ Architecture
Backend (Rust)
The Tauri backend provides 7 command handlers:
select_video_file- Opens native file dialog for video selectionselect_subtitle_file- Opens native file dialog for subtitlesselect_output_file- Opens native save dialogget_duration- Extracts video duration using ffprobecheck_ffmpeg_availability- Validates FFmpeg/ffprobe installationprocess_video- Spawns FFmpeg process with progress trackingcancel_process- Kills running FFmpeg process by job ID
Job-based Processing:
- Each
process_videocall returns a unique UUID job ID - Jobs are stored in a concurrent HashMap for cancellation
- Progress events are emitted with job ID for tracking
- Events:
ffmpeg-progress,ffmpeg-complete,ffmpeg-error,ffmpeg-cancelled
Frontend (React + TypeScript)
- State Management: Zustand for global state
- Styling: Tailwind CSS
- UI Components: Custom React components
- Video Preview: Uses Tauri's
convertFileSrcfor secure file access - Event Handling: Listens to backend events for progress updates
🔒 Security
- Sandboxed Renderer: Frontend runs in a sandboxed environment
- IPC Communication: All native access through Tauri commands
- Asset Protocol: Uses Tauri's asset protocol for secure video preview
- Input Validation: Rust backend validates all file paths and parameters
- No Node Integration: Frontend has no direct system access
🐛 Troubleshooting
FFmpeg Not Found
If you see "FFmpeg Not Found" on startup:
- Install FFmpeg following the prerequisites above
- Ensure
ffmpegandffprobeare in your system PATH - Test from terminal:
ffmpeg -versionandffprobe -version - Restart the terminal and application
- Click "Retry" in the modal after installation
Build Failures
Linux: Make sure all system dependencies are installed (see above)
# Install all dependencies at once
sudo apt install -y libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev pkg-config
macOS: Install Xcode command line tools
xcode-select --install
Windows: Install Visual Studio Build Tools with C++ workload
- Download from: https://visualstudio.microsoft.com/downloads/
Performance Issues
- Ensure you're using a recent version of FFmpeg (4.x or 5.x recommended)
- Check that your system has sufficient disk space for output files
- For large files (>2GB), consider trimming to smaller segments first
- Hardware acceleration depends on your FFmpeg build and system
Process Won't Cancel
If the cancel button doesn't stop processing:
- The process may take a few seconds to terminate
- Check Task Manager/Activity Monitor for lingering ffmpeg processes
- Ensure you have the latest version of the app
📝 Migration from Electron
This project was migrated from Electron to Tauri 2.x in January 2026. Key improvements:
- ✅ Smaller Bundle: Removed 262 Electron packages
- ✅ Better Security: Rust backend with type-safe command handlers
- ✅ Faster Startup: Native Rust performance vs Node.js
- ✅ Process Cancellation: NEW - Stop processing anytime
- ✅ Startup Validation: NEW - FFmpeg check with helpful error messages
- ✅ Window Protection: NEW - Prevents accidental closure during processing
- ✅ Better Error Handling: Comprehensive validation and user-friendly messages
The Electron version is preserved in git tag v1.0.0-electron for reference.
🤝 Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
Development Setup
- Fork the repository
- Install dependencies:
npm install - Make your changes
- Test thoroughly with
npm run dev - Run type checking:
npm run type-check - Run linter:
npm run lint - Submit a pull request
📄 License
MIT License - See LICENSE file for details
🙏 Acknowledgments
- Built with Tauri
- Powered by FFmpeg
- UI styled with Tailwind CSS
- State management by Zustand
- Rust async runtime by Tokio
Note: This application requires FFmpeg to be installed separately. It does not bundle FFmpeg to:
- Keep the application size small
- Respect FFmpeg's licensing requirements (GPL/LGPL)
- Allow users to use their preferred FFmpeg build (standard, full, with hardware acceleration, etc.)