A complete, professional Windows desktop GUI for FFmpeg. Every common media operation has a clean form, and a built-in Command Console runs any raw FFmpeg command — so the whole power of FFmpeg is available from one app.
FFmpeg and FFprobe are bundled (ffmpeg-static / ffprobe-static), so no
separate FFmpeg installation is required.
| Module | What it does |
|---|---|
| Media Info | Full ffprobe metadata: format, streams, codecs, bitrate, resolution, fps |
| Convert | MP4 (H.264/H.265), MKV, MOV, WEBM (VP9/VP8), AVI, WMV, FLV, MPG, TS, 3GP, OGV, GIF + quality, resolution & social aspect presets (9:16, 1:1, 16:9, 4:5) |
| Compress | Constant-quality (CRF/CQ) or target file size (two-pass). Auto-detects GPU encoders (NVENC / QuickSync / AMF) |
| Cut / Trim | Fast stream-copy or precise re-encode |
| Extract Audio | MP3, M4A/AAC, WAV, FLAC, OGG, Opus |
| Audio Convert | Transcode audio + sample-rate / channel control |
| Audio FX | Loudness normalize (EBU R128), volume gain, fade in/out — on a video or an audio file |
| Audio Track | Mute, replace or mix the soundtrack of a video (video stream-copied) |
| Merge / Join | Concatenate clips (fast copy or re-encode with normalisation) |
| Image → Video | Turn a still image + an audio file into a video (e.g. a song with a cover) |
| Effects | Crop, rotate, flip, speed, brightness/contrast/saturation, denoise, sharpen, image watermark, text overlay + live preview and a Preview frame button that renders the current frame through FFmpeg itself |
| Stabilize | Smooth shaky footage with libvidstab (two-pass) |
| Reverse / Loop | Play a clip backwards, or repeat it N times |
| Snapshot / Frames | Save one frame, export many frames, or a contact-sheet thumbnail grid |
| GIF Maker | High-quality palette-based animated GIF |
| Subtitles | Burn-in (hardsub), embed (softsub), or extract an embedded subtitle track |
| Metadata | Edit title / artist / album tags without re-encoding |
| Batch | Convert or compress many files at once |
| Downloader | Download from YouTube / Vimeo / TikTok / 1000+ sites via yt-dlp (auto-fetched on first use); video presets or audio-only MP3 / M4A |
| Command Console | Run any raw FFmpeg command with {input} / {output} placeholders |
FFmpeg itself cannot download from YouTube — that needs yt-dlp, which the Downloader fetches automatically on first use and runs with the bundled FFmpeg to merge the streams. Needs an internet connection.
npm install
npm startnpm test # unit tests for the pure argument builders (node:test)
npm run lint # ESLint over src/ and test/
npm run check# bothtest/ffargs.test.js covers the builders; test/regressions.test.js locks in the
behaviour of each fixed bug — notably the filtergraph escaping rules, which were
derived by rendering every case with the bundled FFmpeg and comparing the frame
against the same text passed through drawtext's textfile= option.
npm run dist # installer (NSIS) + portable
npm run dist:installer # installer only
npm run dist:portable # portable .exe onlyOutput lands in release/:
FFmpeg-Studio-Setup-<version>.exe— installerFFmpeg-Studio-Portable-<version>.exe— single-file portable
App icon: place a
build/icon.ico(256×256) to brand the packaged app. Without it, electron-builder falls back to the default Electron icon.
src/
main.js Electron main process — windows, IPC, job lock, spawns ffmpeg/ffprobe
preload.js Secure contextBridge API exposed to the UI
ffargs.js Pure FFmpeg argument builders (no Electron deps; unit-testable)
ytargs.js Pure yt-dlp argument builder
index.html UI structure (sidebar modules + workspace + job bar)
renderer.js UI logic
styles.css Dark theme
test/
ffargs.test.js builder unit tests
ytargs.test.js downloader argument tests
regressions.test.js one test per fixed bug
- The Command Console makes the app a true superset of FFmpeg: anything not covered by a dedicated form can be typed directly.
- Long encodes show live progress, encode speed and ETA, and can be cancelled; cancelling removes the partial output file it created. A file that already existed before the job started is never deleted.
- A job is refused if its output path is one of its own inputs — FFmpeg opens
the output with
-yand would truncate the source while reading it. - Only one job runs at a time; the main process enforces this, so a second request is rejected rather than corrupting the first one's progress and cancellation state.
- Text overlays and subtitle filenames may contain quotes, colons, percent
signs, commas and brackets — they are escaped for the filtergraph and drawn
literally (
expansion=none). - Soft subtitles are muxed with the codec the chosen container accepts
(
mov_textfor MP4/MOV,srtfor MKV,webvttfor WebM). - Merging with re-encode handles clips that have no audio track by substituting generated silence of the right length.
© 2026 Vibe Solution — MIT License.