Free Video to GIF — make GIFs without uploading
Drop in an MP4, WebM, MOV, MKV, AVI, FLV, 3GP or WMV file and turn it into an animated GIF. Tune width, frame rate, palette quality, loop and trim. The whole conversion runs in your browser via FFmpeg.wasm — your video never leaves your device.
The browser decodes each frame natively; gifenc (~22 KB, cached on first use) builds a shared 256-colour palette from sampled frames, then quantises each frame against it.
Why people still convert video to GIF
MP4 is smaller and looks better, but GIF auto-plays everywhere with zero friction. That's why the format refuses to die.
Reels & TikTok teasers
Strip a 3-second loop out of a vertical Reel or TikTok to share as an animated preview in DMs.
README demos
Embed a working-product GIF at the top of a GitHub README — way more compelling than a screenshot.
Slack & Discord reactions
Capture a 2-second clip of a friend's blooper and ship it as a custom reaction GIF.
Support tickets
Screen-record a bug reproduction and convert to GIF — auto-plays inline in every issue tracker without a video player.
Blog mini-animations
Drop a short looping GIF into a tutorial post to show an interaction that's awkward to describe in words.
Twitter video alt
X's video player buries replies — a GIF tweet plays inline and keeps the thread visible.
FFmpeg, palette-optimized, in your tab
Drop a video
Drop the file or click to browse. The browser previews it via a blob URL — nothing is uploaded.
Pick width, fps, quality
Lower numbers = smaller GIF. 480 px wide at 15 fps is a good starting point for social.
FFmpeg builds a per-clip palette and quantizes
GIF only allows 256 colors per frame. FFmpeg runs palettegen to pick the best palette, then paletteuse with dithering to map every frame onto it. All three quality tiers use the same two-pass pipeline; they differ in stats_mode (palette accumulation strategy) and dithering algorithm.
Preview & download
The GIF lands in an <img> tag (browsers auto-play GIFs) and a one-click download. Source video is discarded from memory.
Frequently asked questions
No. The video is decoded by FFmpeg compiled to WebAssembly, running entirely inside this browser tab — exactly the same engine as our Video to MP3 tool. Your file never leaves your device. Network requests are only made on first run to fetch the FFmpeg.wasm core from jsDelivr.
GIF is limited to a 256-color palette per frame, so smooth gradients (skies, skin tones, lens flares) tend to band. Two fixes: switch the Quality dropdown to Best (palette per frame), and drop the frame rate to ~12 fps — the encoder spends more bits per frame and the result is dramatically cleaner.
GIF is an ancient, inefficient codec — a 5-second 720p clip can easily land at 5–10 MB. For most sharing use cases an MP4 or WebM is 10–50× smaller. GIF still wins on Slack, Discord and X because they auto-play and auto-loop without a click.
There's no hard cap, but anything above ~1280 px makes the GIF balloon to absurd file sizes because every pixel × every frame needs its own palette entry. 480–720 px is the sweet spot for social GIFs. The form will still let you try larger values.
Yes. Enter start and end times in the Trim fields (formats accepted: 1:23, 1:23.5, 83 seconds, 1:02:30). Or scrub the video to a position and click "Set end" to grab the current playhead — same controls as our Video to MP3 tool. Leave both empty for the whole clip.
The first pass scans the entire clip and picks the optimal 256-color palette (palettegen) before the second pass quantizes each frame against it (paletteuse) with Bayer dithering. Two-pass produces much better gradients than the single-pass split-filter approach used for the faster modes.
About browser-side GIF conversion
"MP4 to GIF" hits ~2M searches a month. Most results are upload-then-download web services that throttle, watermark, or paywall once the clip is longer than a few seconds. There's no reason for that to be the case — every modern browser ships a JavaScript engine that can run FFmpeg directly.
What FFmpeg.wasm is
FFmpeg is the codec swiss-army-knife that powers VLC, YouTube, Netflix, Chrome's built-in player, and virtually every other video stack on the planet. FFmpeg.wasm is the same C codebase compiled to WebAssembly, which means it runs at roughly native speed inside a browser tab with no installation. The page you're looking at is a thin UI wrapper around the exact same library.
The palette trick
Naively running ffmpeg -i input.mp4 output.gif produces a GIF with the default 256-color web palette — flat, dithered, and ugly. The high-quality recipe builds a custom palette for the specific clip:
- palettegen scans the frames and picks the 256 colors that best represent the content.
- paletteuse remaps every frame onto that palette with Bayer dithering to avoid hard banding.
- stats_mode=single (Best) builds a separate palette for every frame for the cleanest possible gradients — two passes, slower but worth it for skin tones and skies.
- stats_mode=diff (High) weights pixels that change a lot — a fast single-pass that handles most clips beautifully.
- stats_mode=full (Standard) treats every pixel equally — fastest, fine for high-contrast UI captures.
Why it stays on your machine
- The input file is mounted into FFmpeg via emscripten's
WORKERFS, so chunks are streamed through the browser's File API instead of forcing the entire clip into a single allocation. It never travels over the network. - The output GIF is read back from MEMFS as bytes, wrapped in a
Blob, and dropped into an<img>tag via ablob:URL. - The only network call on this page is the one-time fetch of the FFmpeg core (~25 MB from jsDelivr) — and that's cached for every subsequent run.
Performance notes
This page uses the single-threaded FFmpeg.wasm build (it doesn't require SharedArrayBuffer, which needs special headers most sites don't set). GIF encoding is significantly slower than MP3 — palette generation is essentially color quantization, which is O(pixels × colors). A 10-second 480p clip at 15 fps takes roughly 8–15 seconds on a modern laptop. Mobile is 2–4× slower.