Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FFmpeg Studio

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.

image

Features

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.

Run (development)

npm install
npm start

Tests & linting

npm test     # unit tests for the pure argument builders (node:test)
npm run lint # ESLint over src/ and test/
npm run check# both

test/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.

Build a Windows app (.exe)

npm run dist            # installer (NSIS) + portable
npm run dist:installer  # installer only
npm run dist:portable   # portable .exe only

Output lands in release/:

  • FFmpeg-Studio-Setup-<version>.exe — installer
  • FFmpeg-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.

Project layout

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

Notes

  • 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 -y and 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_text for MP4/MOV, srt for MKV, webvtt for 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.

Releases

Packages

Contributors

Languages