Convert MP4 video to GIF for free — pick the range and create it in your browser, no upload.
Open the MP4, choose a few seconds, pick a width and a frame rate, and Nerulio decodes the MP4's video track with your browser's WebCodecs decoder and writes a GIF. Most MP4s carry H.264 video, which browsers decode widely; MP4s from newer phones and cameras may carry HEVC or AV1, whose support depends on the browser and device. The audio track is ignored, a phone's rotation flag is applied, and a variable-frame-rate recording becomes an evenly paced GIF.
Drop video files hereProcess many files at onceNo upload · processed on this device
Making a game?
Nerulio is a 2D game asset studio first: draw pixel art, cut sprite sheets into animations, pack texture atlases, check autotile tilesets and export them for Godot, Unity, Phaser and other engines. It runs in your browser; files stay on your device.
MP4 is a container. The video inside is usually H.264 (AVC); MDN also lists AV1 and VP9 as MP4 video codecs, and many phones write HEVC. The container stores a timestamp for every frame and, for phone recordings, a rotation flag. Nerulio reads those with Mediabunny and decodes only the frames it needs, in time order, in a background worker.
Phone MP4s are often recorded at 30 or 60 fps and with a variable frame rate. A GIF has fixed delays, so Nerulio samples the section at even steps of 1 ÷ fps seconds and takes whichever frame is on screen at each step: a 60 fps recording at 15 fps keeps one frame in four, and uneven source timing comes out evenly paced.
A portrait phone MP4 is usually stored as landscape pixels plus a 90° rotation flag. Frames are turned upright before scaling, so the width you pick applies to the upright picture: 480 px wide from a 1080 × 1920 clip gives 480 × 853.
H.264 (AVC)
The most common MP4 video codec, widely decoded by browsers.
Variable frame rate
Frame timestamps that are not evenly spaced, common in phone and screen recordings.
Rotation flag
Metadata saying the stored picture must be turned for display.
Example: a 4-second portrait phone MP4 at 60 fps
Width 480 px, 15 fps, crop 4:5:
Source 1080 × 1920 as displayed (stored 1920 × 1080 + 90° flag), 60 fps, H.264 + AAC
Width 480 480 × 853 px after turning upright
Frames 4 s × 15 fps = 60 frames: one source frame in four
Crop 4:5 480 × 600 px, centred (253 px cut: 126 at the top, 127 at the bottom)
Index data 480 × 600 × 60 = 17.3 million bytes before LZW
AAC audio not read
Without the crop the same GIF is 480 × 853 × 60 = 24.6 million bytes of index data, which is why tall phone clips are worth cropping or narrowing.
From the MP4 to the GIF
In the MP4
In Nerulio
In the GIF
H.264, HEVC or AV1 video track
Decoded frame by frame with WebCodecs
Palette images of up to 256 colours
Frame timestamps, even or variable
Sampled every 1 ÷ fps s inside the section
Delays in 1/100 s, e.g. 70-60-70 ms at 15 fps
Rotation flag
Applied before scaling
Upright frames
AAC audio track
Not read
No sound
Other tracks, chapters, subtitles
Ignored
—
Check the result
After opening, the file line shows the upright dimensions and the duration; a sideways size means the MP4 has no rotation flag.
The frame count in the summary should be seconds × fps ÷ speed.
Compare the GIF's first frame with the MP4 at the section start using the Result and Source tabs.
Troubleshooting
Symptom
Likely cause
How to check
Fix
Decoder error as soon as the GIF starts
The MP4 holds HEVC or AV1 and this browser has no decoder for it
The MP4 carries no rotation flag, or one the reader does not apply
Compare with the phone's own player
Export the MP4 again from the phone or editor
The file is far too big for a portrait clip
Tall frames: 853 px high at 480 px wide
Result dimensions
Crop to 4:5 or 1:1, or choose 320 px
Other ways to do it
Option
When it is the better choice
FFmpeg with palettegen and paletteuse on the MP4
Scripts and batches, with one palette for the whole clip.
Keep it as a short MP4
Where the platform plays MP4: smaller than a GIF and with sound; cut it with trim.
What this page does not cover
The browser must decode the MP4's video codec; HEVC and AV1 support varies by browser and device.
Only the primary video track is used.
Versions and sources
Checked in tests/media-browser.mjs with a 1920 × 1080 H.264/AAC MP4 in Chromium 153 and Firefox 155: 2 s at 640 px and 12 fps gave 24 frames 640 px wide. MP4 codec facts follow MDN; HEVC browser support is from caniuse.
MP4 is the video format used by most phones, cameras and editors.
GIF size depends heavily on width, frame rate and colours; short clips at a modest width share best.
Your file is never uploaded — it is processed inside this browser.
Video to GIF
Set width, frame rate and palette size; frames are processed sequentially.
How it works
Open a video and select a short range
Set width, frame rate and palette size
Export a GIF and check motion, colors and file size
Supported formats
MP4 / WebM / MOV → GIF — Input decoding and output encoding depend on browser support.
What this tool does
Decode one frame at a time; choose GIF width, FPS, palette size and dithering.
Implementation and verified quality
advanced · WebCodecs sequential frames / gifenc adaptive palettes / measured size targets. Quality qualification is in progress. Pro/Flagship quality has not been established.
Before you export
Fast cut shrinks to inner keyframes. Precise mode re-encodes; codec availability varies. Temporary outputs use local browser storage when available. Compatibility recording retains its short-clip limits.
Frequently asked questions
What determines the supported size?
Actual device memory, storage and codec support. Tested examples are evidence, not a guarantee for every file.
Are my files uploaded?
This tool processes the files you open on your device without uploading them. Images you explicitly attach to community posts are uploaded separately. Optional engines and models are downloaded from third parties; those requests expose connection information such as your IP address.
Will my work be saved automatically?
No. Images and editing state stay in this tab; media output can use local temporary storage. Changing language preserves your work; reloading, closing the tab, or following a link to another page can clear it.