A native Windows desktop application that wraps FFmpeg with a clean, modern GUI.
Convert video and audio files without touching a terminal β with full GPU hardware acceleration support.
- Drag & drop or browse to open any video/audio file
- 13 output formats β MP4, MP4 H.265, WebM, MKV, AVI, MOV, GIF, MP3, AAC, FLAC, WAV, OGG, Opus
- Live progress bar β accurate percentage from file duration (via ffprobe)
- Conversion stats β FPS, encode speed, elapsed time, output size
- Cancel a running conversion at any time
| Vendor | Codec | What it uses |
|---|---|---|
| NVIDIA | h264_nvenc, hevc_nvenc |
NVDEC (decode) + NVENC encode silicon on the GPU die. Full zero-copy VRAM pipeline when no filters are applied. |
| AMD | h264_amf, hevc_amf |
D3D11VA (decode) + AMF/VCE hardware encoder on the GPU die. CQP mode. |
| Intel | h264_qsv, hevc_qsv |
Intel Quick Sync Video β built-in encoder on Core iX CPUs. |
| CPU | libx264, libx265, VP9, AV1 | All available CPU cores (-threads 0). |
| Preset | Description |
|---|---|
| Extract Audio | Lossless MP3 audio pull, no re-encode |
| Compress for Web | H.264 720p, CRF 28 |
| Max Compression | H.265 480p, CRF 32 |
| High Quality | H.264 original res, CRF 18 |
| To GIF | Short clip to animated GIF |
| Fast Remux | Change container without re-encoding |
| π’ NVENC H.264 | NVIDIA GPU H.264 (p6 quality, adaptive-QC) |
| π NVENC H.265 | NVIDIA GPU H.265 β 50% smaller files |
| π΄ AMD AMF | AMD GPU H.264 (CQP mode) |
- Video: codec, CRF/quality, preset, bitrate, resolution scale, FPS, strip video
- Audio: codec, bitrate, sample rate, channels, strip audio
- Trim: start/end time
- Extra FFmpeg args: raw passthrough for power users
- Collapsible terminal panel at the bottom of the window
- Shows the exact FFmpeg command being run
- Streams every stderr line in real time (colour-coded: commands in blue, errors in red, progress in green)
- Max 500 lines, auto-scroll, Clear button
βββββββββββββββββββββββββββββββββββββββ
β React + TypeScript UI β
β (Vite dev server / Tauri WebView) β
β β
β File drop β ffprobe β MediaInfo β
β Options β startConversion invoke β
ββββββββββββββββ¬βββββββββββββββββββββββ
β Tauri IPC (invoke / emit)
ββββββββββββββββΌβββββββββββββββββββββββ
β Rust Backend (lib.rs) β
β β
β get_ffmpeg_status β async thread β
β get_media_info β ffprobe JSON β
β start_conversion β FFmpeg spawn β
β β’ HW accel flags before -i β
β β’ stderr β ffmpeg://debug event β
β β’ stdout β conversion://progress β
β cancel_conversion β kill child β
ββββββββββββββββ¬βββββββββββββββββββββββ
β child process
ββββββββββββββββΌβββββββββββββββββββββββ
β ffmpeg / ffprobe (bundled ~191 MB) β
βββββββββββββββββββββββββββββββββββββββ
Input file
β NVDEC (GPU decode, frames stay in VRAM)
β NVENC encode silicon (no CPU copy)
β Output file
When scaling or FPS conversion is needed, frames transit through CPU for filtering, then back to NVENC β still much faster than pure CPU encoding.
- Windows 10/11 x64
- FFmpeg GPL static build β
ffmpeg.exeandffprobe.exemust be named with the target triple:ffmpeg-x86_64-pc-windows-msvc.exeffprobe-x86_64-pc-windows-msvc.exe
- For GPU acceleration: NVIDIA drivers 522+, AMD Adrenalin 2023+, or Intel drivers with QSV
| Tool | Version | Notes |
|---|---|---|
| Node.js | β₯ 20 | |
| Rust + Cargo | β₯ 1.75 | Install via rustup |
| MSVC Build Tools | 2022 | VC++ workload + Windows 11 SDK |
| Windows SDK | 10.0.22000+ | Required by Rust/MSVC linker |
git clone <repo-url>
cd ffmpeg-converter
npm installDownload the FFmpeg GPL static build from gyan.dev (ffmpeg-release-full.7z).
Extract ffmpeg.exe and ffprobe.exe, then rename and place them:
src-tauri/binaries/
βββ ffmpeg-x86_64-pc-windows-msvc.exe
βββ ffprobe-x86_64-pc-windows-msvc.exe
npm run tauri devOr use Ctrl+Shift+B β FFmpeg Converter: Dev (hot-reload) in VS Code.
npm run tauri buildOutput installer: src-tauri/target/release/bundle/nsis/
cd src-tauri
cargo checkIf Cargo can't find the linker, set these in PowerShell before building:
$msvc = "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207"
$sdk = "C:\Program Files (x86)\Windows Kits\10"
$ver = "10.0.22000.0"
$env:PATH = "C:\Program Files\nodejs;$msvc\bin\Hostx64\x64;$env:PATH;$env:USERPROFILE\.cargo\bin"
$env:LIB = "$msvc\lib\x64;$sdk\Lib\$ver\ucrt\x64;$sdk\Lib\$ver\um\x64"
$env:INCLUDE = "$msvc\include;$sdk\Include\$ver\ucrt;$sdk\Include\$ver\um;$sdk\Include\$ver\shared"These are pre-configured in .vscode/tasks.json and .vscode/settings.json.
ffmpeg-converter/
βββ src/ # React frontend
β βββ App.tsx # Root component, state machine
β βββ api.ts # Tauri invoke wrappers + TypeScript types
β βββ presets.ts # Output formats, quick presets, codec lists
β βββ index.css # Tailwind + CSS custom properties (light mode)
β βββ components/
β βββ FileDropZone.tsx # Drag-drop / click-to-pick file input
β βββ FormatSelector.tsx # Format button grid
β βββ QuickPresets.tsx # 9 one-click preset cards (incl. GPU presets)
β βββ AdvancedOptions.tsx # Collapsible panel (video/audio/trim/extra)
β βββ ProgressPanel.tsx # Progress bar + stats + cancel/done
β βββ DebugConsole.tsx # Collapsible FFmpeg stderr terminal
β βββ Tooltip.tsx # Hover tooltip (fixed position, 400ms delay)
βββ src-tauri/
β βββ src/
β β βββ lib.rs # All Rust logic (commands, GPU accel, events)
β β βββ main.rs # Entry point
β βββ binaries/ # FFmpeg static binaries (target-triple suffix)
β βββ capabilities/
β β βββ default.json # Tauri v2 permission declarations
β βββ Cargo.toml
β βββ tauri.conf.json
βββ .vscode/
βββ tasks.json # 6 build tasks (all include MSVC env vars)
βββ settings.json # rust-analyzer + terminal env
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 (Rust) |
| Frontend | React 18 + TypeScript + Vite |
| Styling | Tailwind CSS v4 (@tailwindcss/vite) β light mode only |
| Backend / IPC | Rust (lib.rs) |
| FFmpeg | GPL static build, bundled in src-tauri/binaries/ |
Edit OUTPUT_FORMATS in src/presets.ts:
{
ext: "format_ext",
label: "Display Name",
description: "Tooltip shown on hover",
isAudioOnly: false,
defaults: { video_codec: "libx264", audio_codec: "aac", crf: 23, preset: "medium" }
}Edit QUICK_PRESETS in src/presets.ts:
{
id: "unique-id",
label: "Short Name",
icon: "π΅",
description: "What this preset does",
build: (inputExt: string) => ({ format: "mp4", video_codec: "copy", ... })
}- Windows only (macOS/Linux would need binary naming + path resolution changes)
- Hardware presets assume driver support β if NVENC/AMF fails, check the Debug Console for the FFmpeg error
- NVENC
p1βp7presets require NVIDIA GTX 16xx / RTX or newer (NVENC SDK 10+) - Batch conversion not yet implemented (one file at a time)