HCODX/Video to GIF
100% browser-based · No upload · MP4 / WebM / MOV / MKV → animated GIF

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.

Input video
GIF output
Drop a video on the left, pick width & fps, and hit Convert to GIF.
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.
Encoding…0%
Frames decoded by the browser, quantised against a single shared palette via gifenc.
Converted GIF preview
GIF · · · — fps ·
Need the audio?
Status
Ready
Input duration
Output
Size saved
Use cases

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.

How it works

FFmpeg, palette-optimized, in your tab

1

Drop a video

Drop the file or click to browse. The browser previews it via a blob URL — nothing is uploaded.

2

Pick width, fps, quality

Lower numbers = smaller GIF. 480 px wide at 15 fps is a good starting point for social.

3

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.

4

Preview & download

The GIF lands in an <img> tag (browsers auto-play GIFs) and a one-click download. Source video is discarded from memory.

FAQ

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

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 a blob: 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.

Related

Related tools