How this video to GIF converter works
Drop a clip, drag the two handles across the filmstrip until they hold the seconds you want, choose a width, download. Your browser plays the file, jumps to one moment at a time and paints each one onto a canvas, and the GIF bytes get written in the tab. There is no link box on this page: it reads a file off your device, and that is the only thing it reads.
Nothing decodes end to end. A three-second selection costs 38 jumps whether the source runs eight seconds or ten minutes, which is why a 92 MB video and a 0.5 MB one finish in about the same time.
Frames land 8 hundredths of a second apart, which comes to 12.5 a second. GIF counts frame delays in hundredths, so a request for 12 frames a second would store the same 8 and turn into 12.5 behind your back; the number the format can keep is the number this uses. The format's own ceiling is 2 hundredths, or 50 a second, and at 256 colors nobody wants to pay for that.
A single 255-color table then gets built from up to eight frames spread across your selection, and every frame is written against it. Each frame after the first stores only the rectangle that moved, with the pixels that held still marked transparent. That trick keeps a locked-off shot cheap and does almost nothing for a handheld one.
What it weighs
Measured on 13 clips from Wikimedia Commons, VP9 WebM at 854 × 480, running 8.5 seconds to 10.5 minutes, covering fireworks at night, a hummingbird at a feeder, ocean waves, a dance troupe, a train pulling in and a flat graphic explainer. Three seconds out of each, median first, then the spread:
- 240 px: 0.48 MB, from 59 KB to 828 KB
- 480 px: 1.65 MB, from 185 KB to 2.8 MB
- 720 px: 3.3 MB, from 376 KB to 5.9 MB
Going from 240 to 480 multiplied the file by 3.4, and 480 to 720 doubled it again. Length costs less than width: at 480 px, five seconds ran to a median 2.8 MB and the full fifteen to 9.1 MB, with the heaviest clip in the set landing at 14.2 MB.
Against the video itself, GIF is the expensive way to carry those seconds. Weighed against the bytes each source spends on the same stretch, the 480 px GIF came out 4.3 times larger at the median and 10.9 times larger at the worst. One file went the other way: a flat graphic sequence gave back 185 KB where the WebM had spent 229 KB, because 255 flat colors are cheap and inter-frame prediction gains little on them.
When you'd reach for it
- A reaction, for a chat. Three seconds at 240 px lands near half a megabyte and plays by itself in a message, with no player and no tap.
- A bug, for an issue tracker. A screen recording is the flattest thing you can feed this. Fifteen seconds of one came to 1.2 MB at 480 px, and an issue tracker renders it inline.
- A moment worth looping. The dog shaking itself, the ball going in, the cat missing the jump. Drag the handles until only that part sits between them.
- A README or a wiki. Both take an animated GIF where neither will take an MP4, and a 480 px strip reads fine in a page column.
- A slide deck that fought you. Some presentation software swallows a GIF and chokes on video.
What this tool cannot do
It has no sound and never will. GIF has carried no audio track since 1989, so the dialogue, the music and the laugh all go. Nothing recovers them afterwards.
Fifteen seconds is the ceiling, and the handles stop rather than warn you later. Push past it and the caption above the strip says so while the handle refuses to move. A 30-second GIF runs to tens of megabytes, which is past the attachment limit most places set.
Your browser has to be able to play the file. H.264 in MP4 works everywhere, and so does VP8 or VP9 in WebM. HEVC, which is what an iPhone records unless the camera is set to Most Compatible, plays in Safari and Edge and gets refused by Chrome and Firefox. Those files come back with an error rather than a bad GIF. Two candidates dropped from the test set failed the same way for a different reason: MPEG-4 Part 2 video inside a QuickTime wrapper, whose audio Chromium played while ignoring the picture. The page said so and stopped.
255 colors for the whole selection, not per frame. Skies, skin and film grain band into visible steps, and a dark clip bands worst. Nothing here dithers, so flat areas stay clean and gradients turn into stripes.
12.5 frames a second, fixed. Anything smoother costs bytes the format spends badly, and this delay is one your browser reproduces exactly.
It cuts, and that is all it does. No captions, no stickers, no text, no cropping, no rotation, no speed change, no reversing. One stretch of one clip.
One clip per run, and 200 MB per file. A 15-second 4K recording off a phone is around 90 MB, so the cap has room; anything above it gets turned away at the dropzone.
Sending video would beat all of this. The same seconds as MP4 run about a quarter of the size at the median and a tenth at the extreme, in full color, with sound. If whatever you are uploading to takes video, send video.
Frequently asked questions
How long does the conversion take?
Three seconds at 480 px took between 0.8 and 8.4 seconds across the 13 test clips, median 2.9. The full fifteen took 3.5 to 27 seconds, median 15. Those come from Chromium on a desktop, and a phone will be slower.
Almost all of that is your browser jumping to the next moment in the video rather than the GIF encoder doing its job: 240 px averaged 62 milliseconds a frame and 720 px averaged 76, though the larger canvas writes nine times the pixels. Clips whose keyframes sit far apart are the slow ones.
Why is my GIF bigger than the video I started with?
GIF stores each frame as a full picture of indexed pixels, with no motion prediction between them worth the name. H.264 and VP9 spend most of their bytes describing how one frame differs from the last, which is where the 4-to-1 gap comes from. Pick 240 px, or take fewer seconds.
Can I paste a link to a video instead?
No. Nothing here fetches anything: the page reads a file you already have on the device you are sitting at. Download the video first, then drop it.
Does the GIF loop?
Forever. The file carries the looping block that browsers, chat apps and forums read as "run it again", and no setting on this page turns it off.
What happened to the sound?
It never made it into the file, because the format has nowhere to put it. When the audio is the point, keep the video and send that.
Why did the handle stop moving?
You reached the fifteen-second ceiling. The caption above the filmstrip changes to say so while it happens, rather than letting a number freeze for no visible reason. Move the other handle to shift the window along instead of stretching it.
The filmstrip is blank. What now?
Your browser opened the file and would not decode the picture, or it refused the file outright. An iPhone .mov holding HEVC is the usual cause on Chrome and Firefox. Re-export the clip as H.264 MP4, or open this page in Safari.
Can I set the in point with the keyboard?
Yes. Click either handle to focus it, then arrow left and right to move it a tenth of a second at a time, or hold shift for whole seconds. The readout above the strip keeps up as you go.
Does the video get uploaded?
No. Your first click on the button fetches the encoder from this site, and the clip itself stays in the tab. Nothing queues, and there is no job on a server for you to go and delete afterwards.
Why does my 4K clip come out 720 pixels wide?
Width is what a GIF pays for, once per frame, with no reuse between them. The three on offer are the ones people send, and the readout above the filmstrip shows the exact canvas before you press anything. A clip narrower than the width you picked comes back at its own size, since the extra pixels would be invented.
The code this page borrows
The palette work comes from gifenc 1.0.3 by Matt DesLauriers, MIT licensed. Its quantize picks the 255 colors that fit your frames best, and applyPalette maps every pixel onto them.
The GIF bytes are written by omggif 1.0.10 by Dean McNamee, also MIT licensed. Of the two writers, its is the one that can crop a frame down to the rectangle that changed, which is where most of the saving on a still-camera shot comes from.
Reading the video needs no library at all. That part is a <video> element, currentTime and drawImage.