How to compress audio to fit discord's 25 mb upload limit — free
- Step 1Open the discord-fit tool — Go to /audio-tools/discord-fit. The page loads the FFmpeg WebAssembly engine in the background while you pick a file — nothing is sent to a server.
- Step 2Drop your audio file — Drag in one MP3, WAV, FLAC, M4A, OGG, or Opus file. Only a single file is processed at a time on this tool. On the free tier the file must be under 50 MB and 30 minutes long.
- Step 3Let it read the duration — There are no options to set — the tool decodes the file's duration as soon as it loads. That single number is the only input the bitrate calculation needs.
- Step 4Run the compression — Click to process. FFmpeg re-encodes to MP3 at the computed bitrate. A 30-minute file finishes in seconds to a minute depending on your CPU; the engine uses multi-threaded WASM where your browser supports it.
- Step 5Check the output size — The result panel shows the input vs output byte size. The output filename gains a
-25mbsuffix (e.g.recording-25mb.mp3). For short clips the output is often well under 25 MB — that is expected (see the cookbook). - Step 6Download and drop into Discord — Download the MP3 and attach it to any Discord message. It plays inline with a scrubber. No Nitro, no re-compress, no 'file too large' error.
Duration → bitrate the tool picks for a 25 MB target
The tool computes floor(25 MB × 8 ÷ seconds × 0.96) then snaps DOWN to a standard MP3 rate. Output size is approximate (CBR MP3). Below ~10 minutes the math wants more than 320 kbps, so it caps at 320 and the file ends up smaller than 25 MB.
| Clip length | Bitrate the math wants | Standard rate picked | Approx output size |
|---|---|---|---|
| 2 min | ~1678 kbps | 320 kbps (capped) | ~4.6 MB |
| 10 min | ~336 kbps | 320 kbps (capped) | ~22.9 MB |
| 15 min | ~224 kbps | 192 kbps | ~20.6 MB |
| 20 min | ~168 kbps | 160 kbps | ~22.9 MB |
| 25 min | ~134 kbps | 128 kbps | ~22.9 MB |
| 30 min | ~112 kbps | 96 kbps | ~20.6 MB |
What is fixed vs what you can change
discord-fit is a one-button tool — needsOptions is false, so no settings panel appears. For anything in the 'you cannot change here' column, use the sibling tool listed.
| Setting | Value in discord-fit | Where to change it instead |
|---|---|---|
| Target size | Fixed at 25 MB | audio-compressor has a Target size (MB) field, 0.5–500 |
| Output codec | Always MP3 (libmp3lame) | bitrate-changer lets you choose the output format |
| Bitrate | Auto from duration, snapped down | bitrate-changer sets an exact bitrate (32–320 kbps) |
| Nitro 500 MB target | Not offered | audio-compressor with a higher target MB |
| WhatsApp 16 MB target | Not in this tool | whatsapp-fit |
Tier limits for audio tools
Per-file size AND duration limits both apply — a file can be under the size cap but over the duration cap on free. discord-fit processes one file at a time.
| Tier | Max file size | Max duration | Files per run |
|---|---|---|---|
| Free | 50 MB | 30 min | 1 |
| Pro | 200 MB | 120 min | 10 |
| Pro-media | 100 GB | unlimited | 100 |
| Developer | 100 GB | unlimited | unlimited |
Cookbook
Real input/output for the common cases people hit when squeezing audio into a free Discord upload. Sizes are computed from the tool's own duration→bitrate logic.
A 30 MB WAV that Discord rejected
Discord refuses anything over 25 MB on the free tier — a short uncompressed WAV exceeds it instantly. The tool re-encodes to MP3 at whatever rate fits, and because the clip is short it caps at 320 kbps, so the result is comfortably small.
Input: jam-session.wav 3 min 30.0 MB (PCM 16-bit/44.1k) Discord upload: rejected (over 25 MB) discord-fit (automatic): duration = 180 s wants floor(25*1024*1024*8/180*0.96) = ~1118 kbps -> capped at 320 kbps Output: jam-session-25mb.mp3 3 min ~6.9 MB (MP3 320 kbps CBR) Discord upload: accepted, plays inline
A 1-hour podcast bounce
Long content is where the duration math matters. An hour of audio only fits 25 MB at a low bitrate, and the tool picks it automatically — fine for speech.
Input: episode-12.mp3 60 min 88 MB (192 kbps) discord-fit (automatic): duration = 3600 s wants ~56 kbps -> snaps DOWN to 48 kbps Output: episode-12-25mb.mp3 60 min ~20.6 MB (MP3 48 kbps) Good enough for spoken-word; for music quality at this length, split it first with audio-splitter and post in parts.
FLAC export from a DAW
Lossless bounces are huge. The tool accepts FLAC directly and returns an MP3 sized to the cap — no need to convert first.
Input: master-bounce.flac 12 min 72 MB
discord-fit (automatic):
duration = 720 s
wants ~279 kbps -> snaps DOWN to 256 kbps
Output: master-bounce-25mb.flac... no -> master-bounce-25mb.mp3
12 min ~22.0 MB (MP3 256 kbps)Already-small clip stays small
If your file is already under 25 MB, the tool still re-encodes to MP3 and the duration math caps short clips at 320 kbps — so a tiny clip comes out tiny, not padded up to 25 MB.
Input: meme-sound.mp3 8 s 180 KB discord-fit (automatic): duration = 8 s -> wants huge bitrate -> capped at 320 kbps Output: meme-sound-25mb.mp3 8 s ~320 KB (MP3 320 kbps) Note: re-encoding lossy->lossy adds a generation; if it already fit, you didn't need this tool.
Voice memo from a phone (M4A)
iPhone Voice Memos export M4A/AAC. The tool transcodes to MP3 and sizes it to fit, so you can drop a long voice note straight into a server channel.
Input: voice-note.m4a 22 min 31 MB (AAC) discord-fit (automatic): duration = 1320 s wants ~152 kbps -> snaps DOWN to 128 kbps Output: voice-note-25mb.mp3 22 min ~20.7 MB (MP3 128 kbps)
Edge cases and what actually happens
File is over 50 MB on the free tier
Blocked on freeThe free tier caps input at 50 MB. A 200 MB lossless bounce won't load until you're on Pro (200 MB) or higher. This is the input limit, separate from the 25 MB output target — the output is always sized to 25 MB regardless of how big the input was.
Clip is longer than 30 minutes on the free tier
Blocked on freeThere are TWO free-tier limits: 50 MB and 30 minutes. A 40-minute file under 50 MB still won't process on free because it exceeds the duration cap. Pro raises it to 120 min; Pro-media and Developer are unlimited. The duration cap is independent of file size.
Short clip comes out far under 25 MB
By designMP3 maxes at 320 kbps. For clips under ~10 minutes the duration math wants a higher bitrate than 320, so the tool caps at 320 and the output is naturally smaller than 25 MB (a 2-minute clip is ~4.6 MB). This is correct — it never pads a file up to the cap.
Output is slightly under 25 MB, never over
ExpectedThe tool reserves ~4% for MP3 container/framing overhead and then snaps the bitrate DOWN to a standard rate. Both choices bias toward staying under the cap, so the result is reliably at or below 25 MB — by design, so Discord never rejects it on the boundary.
You wanted Opus, not MP3
Not supporteddiscord-fit always outputs MP3 (libmp3lame). There is no codec option in the UI (needsOptions is false). MP3 plays inline everywhere on Discord. If you specifically need Opus or another codec, transcode the result with bitrate-changer, which exposes a format choice.
You expected an 8 MB target
Outdated capDiscord's old free cap was 8 MB years ago; the current free per-file limit is 25 MB, which is what this tool targets. If your specific server still enforces a lower boost-dependent limit, compress to a custom smaller size with audio-compressor.
You have Nitro and want to use the 500 MB cap
Use audio-compressorThis tool only targets the free 25 MB ceiling — there is no Nitro toggle. If you have Nitro (500 MB) and want higher quality, use audio-compressor with a larger target size, or bitrate-changer to set a high bitrate directly.
Re-encoding a lossy file degrades quality
Generation lossIf the input is already a lossy MP3/AAC/Opus, re-encoding to MP3 is a second lossy pass and adds artifacts. For a long file that must fit 25 MB there's no avoiding a bitrate drop. To minimise loss, feed the original lossless source (WAV/FLAC) when you have it rather than an already-compressed copy.
Trying to drop several files at once
Single file onlydiscord-fit processes one file per run (acceptsMultiple is false). Run them one at a time, or for batch sizing on Pro+ use the sibling tools that accept multiple files. Each file is sized to 25 MB independently.
Corrupt or zero-duration file
Decode errorThe bitrate math needs a valid duration; the tool clamps duration to at least 1 second to avoid divide-by-zero, but a truly unreadable or zero-length file will fail to decode in FFmpeg and surface an error rather than produce output. Re-export the source and retry.
Frequently asked questions
What is Discord's free file size limit?
25 MB per file on the free tier. This tool targets that exact ceiling. (The 8 MB figure you may remember is an old cap that Discord raised years ago.) Nitro raises the limit to 500 MB, but you don't need Nitro to use this tool — it's built specifically for the free 25 MB cap.
Do I have to set a bitrate or target size?
No. There are no settings at all. The tool reads your clip's duration and computes the bitrate that fits 25 MB on its own, then snaps down to a standard MP3 rate. The only thing you do is drop a file and download the result.
What format is the output?
Always MP3 (constant bitrate, encoded with libmp3lame). MP3 plays inline in every Discord client and is streamable by discord.js and Discord.py bots. The output filename gets a -25mb suffix, e.g. recording-25mb.mp3.
What input formats can I drop?
MP3, WAV, FLAC, M4A (AAC), OGG, and Opus. Lossless inputs like WAV and FLAC give the cleanest result because there's no prior lossy generation. The tool decodes the input and re-encodes to MP3 at the computed bitrate.
Why is my output much smaller than 25 MB?
For clips under about 10 minutes, the math wants a bitrate above 320 kbps, but MP3 caps at 320, so the file ends up smaller than 25 MB. That's expected — the tool never pads a file up to the cap. A 2-minute clip comes out around 4.6 MB at 320 kbps.
Will my output ever be over 25 MB and get rejected?
No. The tool reserves ~4% for container overhead and snaps the bitrate down to a standard rate, both of which keep the result at or below 25 MB. It's biased to stay under the cap so Discord never rejects it on the boundary.
Is my audio uploaded anywhere?
No. Everything runs in your browser via FFmpeg compiled to WebAssembly. The audio bytes never leave your machine — there's no server-side processing. Only an anonymous 'file processed' counter is recorded for signed-in dashboard stats, never the content.
Can I compress a 40-minute recording on the free tier?
Not on free — the free duration cap is 30 minutes (and 50 MB). A 40-minute file needs Pro (120 min) or higher. Alternatively, split the recording first with audio-splitter and fit each part separately.
I have Discord Nitro — should I still use this?
Only if you want to stay under 25 MB anyway (e.g. posting in a server channel where lots of people are on free). With Nitro's 500 MB cap you can keep higher quality using audio-compressor with a bigger target, or bitrate-changer to set a high bitrate.
How is this different from the general audio compressor?
audio-compressor lets you type any target size from 0.5 to 500 MB and choose a format — it's the configurable version. discord-fit is the one-button shortcut that hard-codes the 25 MB Discord cap and MP3 output so there's nothing to think about.
Does it work for music as well as speech?
Yes, but quality depends on length. Short music clips fit 25 MB at 320 kbps and sound great. Long music (45–60 min) only fits at 48–64 kbps, which is fine for speech but lossy for music — split long mixes with audio-splitter and post in parts for better quality per piece.
Can a Discord bot play the output?
Yes. The output is standard MP3, which discord.js (via @discordjs/voice) and Discord.py can stream into a voice channel directly. Bots transcode MP3 to Discord's internal Opus on the fly, so no extra conversion is needed on your end.
Privacy first
Every JAD Audio tool runs entirely in your browser via FFmpeg (WebAssembly) and RNNoise. Your audio files never leave your device — verified by zero outbound network requests during processing.