How to compress video to fit discord's 25 mb cap locally
- Step 1Drop your clip onto the tool — Drag in an
MP4,MOV,MKV,WebM,AVI,M4V, orTSfile, or click to browse. A hidden<video>element probes duration and resolution instantly so the encoder knows your clip length before you run it. - Step 2Leave Target size on 25 — The Target size select has two values:
25(free Discord, encodes to a 24 MB ceiling) and50(Nitro Basic, encodes to 49 MB). For a free account, keep it on25— that is the only knob; there is no resolution, CRF, or preset control on this tool by design. - Step 3Run the compressor — Click Run Discord Fit. The tool probes duration, computes
videoKbps = floor(24MB × 8 / duration) − audioKbps, and encodes. The render dashboard shows the live stage —Hardware encoding · frame N/totalon the WebCodecs path, orSoftware encoding · Ns / Ns of sourceon the FFmpeg fallback. - Step 4Check the result card — The result panel shows
input → outputbyte sizes and elapsed time. Confirm the output is under 25 MB (it normally lands at 22–24 MB). The size is verified after encode; if it ran slightly over, you get the file anyway with a console warning — see the edge cases for when that happens. - Step 5Download the MP4 — Click Download to save the compressed
.mp4as a blob. This tool does not stream to disk — the file is held in the tab until you download it, then it is gone (refreshing clears everything). - Step 6Send it inline on Discord — Attach the downloaded MP4 in any Discord channel or DM. Because it is H.264 MP4 under the cap, it embeds and plays inline rather than showing as a download-only attachment.
What bitrate you get at the 25 MB target, by clip length
Computed as floor(24 MB × 8 / duration_seconds / 1000) − audioKbps, with the 200 kbps video floor applied. Audio is 96 kbps under 30 s, 128 kbps at 30 s and above. Figures are the video bitrate the tool requests; real output varies a little with content.
| Clip duration | Audio (AAC) | Video bitrate requested | Practical quality at this bitrate |
|---|---|---|---|
| 15 s | 96 kbps | ~12,700 kbps | Effectively transparent for any content, even fast gameplay |
| 30 s | 128 kbps | ~6,300 kbps | Excellent — 1080p gameplay or screen capture looks clean |
| 1 min | 128 kbps | ~3,100 kbps | Very good for 720p/1080p talking-head or UI capture |
| 3 min | 128 kbps | ~940 kbps | Usable; soft on high-motion, fine for slides/webcam |
| 5 min | 128 kbps | ~510 kbps | Visible artefacts on motion; trim first for a sharper result |
| 12 min | 128 kbps | 200 kbps (floor) | Below the floor the math would request — quality drops hard; trim or split |
The 25 MB target vs sending it another way
Why pre-compressing to fit beats the alternatives Discord users reach for.
| Approach | What happens | Trade-off |
|---|---|---|
| This tool, target 25 | Re-encode to ~24 MB H.264 MP4 locally | One re-encode; quality is predictable from duration; embeds inline |
| Upload the raw file | Discord rejects it at the gate if over 25 MB | No send at all on free tier |
| Drive / WeTransfer link | File leaves your machine to a third party | Privacy cost; recipients click out of Discord; link can expire |
| Buy Nitro Basic | 50 MB cap (use the 50 target here) | Monthly cost; still capped — long clips still need compression |
Cookbook
Real clips, real durations, and what the tool does with each at the 25 MB target. Sizes are typical outputs, not guarantees — content complexity moves them a little.
A 45-second 1080p gameplay clip
The most common case: a short highlight that is 60–90 MB raw because the capture bitrate was high. At 45 s the math gives plenty of headroom, so quality is near-transparent.
Input: highlight.mp4 · 82 MB · 45.0s · 1920x1080
Math: 24MB target → total ~4,470 kbps
audio 128 kbps (≥30s) → video ~4,340 kbps
Output: discord-fit.mp4 · ~23 MB · H.264 + AAC
Result: embeds inline on free Discord, looks cleanA 4-minute screen recording
Long enough that the per-second budget is tight. Screen capture compresses well (mostly static UI), so this stays readable where 4 minutes of gameplay would not.
Input: demo.mov · 310 MB · 240.0s · 2560x1440
Math: 24MB target → total ~838 kbps
audio 128 kbps → video ~710 kbps
Output: discord-fit.mp4 · ~24 MB
Result: text stays legible; fine for a bug-report clipA 10-second meme clip
Short clips hit the under-30 s audio rule (96 kbps) and get an enormous video budget. The output may end up well under 24 MB because the source is simple.
Input: meme.webm · 6 MB · 9.5s · 640x640
Math: audio 96 kbps (<30s)
video budget ~20,000 kbps (more than the source needs)
Output: discord-fit.mp4 · ~5 MB
Note: stays small because the source bitrate is the real ceilingA 9-minute clip the floor can't save
Past roughly 12 minutes at the 25 MB target, the computed bitrate would drop below the 200 kbps video floor. The floor wins, so the file may overshoot 24 MB — the tool still hands you the result with a warning.
Input: vlog.mp4 · 540 MB · 540.0s (9 min) Math: 24MB → total ~355 kbps; video ~227 kbps (near floor) Output: discord-fit.mp4 · ~24 MB (just fits) At 12+ min the 200 kbps floor pushes output OVER 24 MB: trim with /video-tools/lossless-trimmer first, or split with /video-tools/video-splitter into two sends
Nitro user wanting 50 MB headroom
Same tool, the 50 target. Doubling the budget roughly doubles every per-second bitrate, so a clip that was soft at 24 MB becomes clean at 49 MB.
Input: raid.mp4 · 600 MB · 300.0s (5 min) Target: 50 (Nitro) → 49MB ceiling Math: total ~1,310 kbps; video ~1,180 kbps (was ~510 at 25) Output: discord-fit.mp4 · ~48 MB Result: clearly sharper than the 25 MB encode of the same clip
Edge cases and what actually happens
Output lands a touch over 25 MB
Soft warningThe size check is a soft target, not a hard reject. After encoding, the tool compares the output to the 24 MB ceiling; if it is over (which only happens once a clip is long enough that the 200 kbps video floor kicks in), it logs size-fit ran NB vs target to the console and hands you the file anyway. For clips up to ~12 minutes this never triggers. If your file is over 25 MB, trim with the lossless trimmer or split with the splitter.
Clip duration can't be read
ErrorThe whole calculation depends on duration. If FFmpeg's probe returns 0 or no duration (corrupt header, fragmented MP4 with no moov atom, or a truly malformed file), the tool throws Could not determine video duration. rather than guessing. Re-mux the file through the transcoder to MP4 first, then retry.
Phone, file over 80 MB, no hardware encoder
RejectedOn mobile the WASM heap can't host a decoder and libx264 encoder for a large source at once. If WebCodecs hardware encode isn't available and the file is over 80 MB, the tool fails fast with a message telling you to trim the clip or run it on desktop, instead of running for 30 seconds then crashing with Aborted(OOM).
Browser runs out of WebAssembly memory mid-encode
ErrorOn the FFmpeg fallback path, a very large or high-resolution source can exhaust the WASM heap (Aborted(OOM) / malloc of size N failed). The tool catches this and returns a plain-language message — try a shorter or smaller-resolution source — rather than dumping a stack trace. Desktop Chrome/Edge with the hardware path almost never hits this.
Source is HDR / 10-bit
Re-encoded to SDR-style H.264The encode targets H.264, which is delivered here as 8-bit. A 10-bit HDR source is tonemapped/converted during the re-encode; colour may shift slightly versus the original. This is expected for a Discord-fit MP4 — Discord's inline player isn't an HDR target anyway.
Clip has no audio track
By designIf the probe reports no audio, the audio budget is dropped and the entire bitrate goes to video — so a silent screen capture actually compresses sharper than the tables suggest. Nothing to configure; the tool detects it.
Already under 25 MB
Re-encoded anywayThis is a compressor, not a pass-through. Even if your input is already 8 MB, it still re-encodes to the computed bitrate. If the source bitrate is lower than the target allows, the output stays close to the source size (it won't inflate). To avoid a needless re-encode when the file already fits, just upload the original to Discord directly.
Output asked for a smaller resolution
Not supported hereThis tool changes bitrate, not pixel dimensions (except the automatic mobile-fallback downscale to 720p to fit the WASM heap). It does not expose a resolution control. To deliberately shrink dimensions, run the video resizer first, then drop the smaller file here.
Free tier, file over 1 GB
RejectedThe Free tier allows up to 1 GB per job and one file at a time. A larger source is rejected at the dropzone with a message naming your tier's limit. Pro raises this to 10 GB / 5 files; Pro + Media to 100 GB / 50 files.
Discord's current cap is different from 25 MB
Set a smaller targetThis tool's two presets are 25 and 50. Discord has changed its free cap over time. If your server's effective cap is lower than 25 MB, this tool can't target it directly — use the WhatsApp compressor (15 MB target) or the email compressor (Outlook 20 MB) as a smaller-target stand-in, then upload.
Frequently asked questions
Will the output always be under 25 MB?
For any clip up to roughly 12 minutes, yes — the tool targets 24 MB to leave a 1 MB muxing margin and the size is verified after encode. Past ~12 minutes the computed video bitrate would fall below the 200 kbps floor, so the output can edge over 24 MB; the tool still hands you the file with a console warning. For long clips, trim or split first.
Why does the target say 25 but the file comes out around 23 MB?
Two reasons. First, the internal ceiling is 24 MB (the extra 1 MB is reserved for MP4 muxing overhead so you never accidentally exceed Discord's gate). Second, real H.264 output rarely hits the requested bitrate exactly — it usually lands a little under. A 22–24 MB result for the 25 target is normal and intended.
What format and codec is the output?
Always MP4 with H.264 video and AAC audio. That pairing plays inline on every Discord client (desktop, web, iOS, Android) without forcing a download. The tool does not output H.265, VP9, or WebM — if you specifically want H.265, use the H.265 encoder, though Discord's inline player handles H.264 most reliably.
Why does my long clip look blurry after compressing?
Because 25 MB is a fixed budget shared across the whole clip. A 30 s clip gets ~6 Mbps of video (excellent); a 5 min clip gets only ~510 kbps (soft on motion). The math is unavoidable — to keep quality on a long clip, trim it to the part that matters with the lossless trimmer, or upgrade to the 50 target if you have Nitro.
Is my video uploaded anywhere?
No. The clip is read into the browser tab and encoded there — via the hardware WebCodecs encoder where available, or FFmpeg.wasm otherwise. Nothing leaves your machine, there is no server round-trip, and refreshing the page wipes the file from memory. The 25 MB target needs no account.
How is the bitrate actually calculated?
Total kbps = floor(24 MB × 8 / duration_seconds / 1000). Audio takes 96 kbps for clips under 30 s and 128 kbps at 30 s or more. Video gets the remainder, floored at 200 kbps. So a 60 s clip with audio gets about 3,100 kbps of video; a 9.5 s clip gets a huge budget capped only by the source's own bitrate.
Does it re-compress a file that already fits under 25 MB?
Yes — it's a compressor and always re-encodes. If your file is already under the cap, you don't need this tool; just upload the original to Discord. Running it on an already-small file re-encodes to the computed bitrate, which won't inflate the size but also won't improve it.
What input formats can I drop in?
MP4, MOV, MKV, WebM, AVI, M4V, and TS. The output is always MP4 regardless of input. If a container won't probe (no readable duration), re-mux it through the transcoder to MP4 first.
Does Discord re-compress the file after I send it?
Discord serves H.264 MP4 files that are within the cap as-is rather than transcoding them. Pre-compressing to fit means the file you encoded is the file your viewers see — no surprise server-side downscale, which is the usual cause of mystery quality loss when you upload an oversized file.
Can I set a custom size like 8 MB or 10 MB?
Not on this tool — its presets are 25 and 50. For a smaller hard target, the WhatsApp compressor aims at 15 MB and the email compressor at 20 MB (Outlook). Either produces an MP4 you can then upload to Discord well under its cap.
It's slow — is something wrong?
Speed depends on the path. On desktop Chrome/Edge the hardware WebCodecs encoder is 5–10× faster than software. On Firefox or older Safari it falls back to FFmpeg.wasm libx264 -preset ultrafast, which is slower but still completes. A multi-minute 1080p source on the software path can take a minute or two — that's expected, not a hang.
Can I compress several clips at once?
Yes, on paid tiers. Pro allows 5 files per job and Pro + Media 50; the tool processes them one after another against the same target, with a per-file download button. The Free tier is single-file. See the batch Discord guide for the workflow.
Privacy first
Every JAD Video tool runs entirely in your browser via WebCodecs and FFmpeg (WebAssembly). Your video files never leave your device — verified by zero outbound network requests during processing.