How to fit audio to discord's 25 mb upload limit automatically
- Step 1Open discord-fit — Go to /audio-tools/discord-fit. The FFmpeg WebAssembly runtime initialises in the page.
- Step 2Drop the file — Drag in one audio file — MP3, WAV, FLAC, M4A, OGG, or Opus. The duration is read immediately; that's the only input the calculation needs.
- Step 3No bitrate to enter — There is no options panel for this tool. The target (25 MB) and codec (MP3) are fixed and the bitrate is computed — so there's nothing to type.
- Step 4Process — Click to run. FFmpeg re-encodes at the computed, snapped bitrate. CBR means the output size lands close to the budget without overshooting.
- Step 5Read the size readout — The result panel shows input and output bytes. For long files it sits just under 25 MB; for short files (capped at 320 kbps) it's smaller. Filename gets a
-25mbsuffix. - Step 6Upload to Discord — Download the MP3 and attach it. Because the bitrate was snapped down with headroom, it's guaranteed under 25 MB and accepted on the free tier.
The bitrate calculation, step by step
How the tool turns a duration into a final MP3 bitrate. Target is fixed at 25 MB. The snapping ladder is 320/256/192/160/128/112/96/80/64/48/32/24/16/8 kbps.
| Duration | Raw = 25MB×8÷s×0.96 | Snapped DOWN to | Approx output |
|---|---|---|---|
| 2 min (120 s) | ~1678 kbps | 320 kbps (ceiling) | ~4.6 MB |
| 10 min (600 s) | ~336 kbps | 320 kbps (ceiling) | ~22.9 MB |
| 15 min (900 s) | ~224 kbps | 192 kbps | ~20.6 MB |
| 20 min (1200 s) | ~168 kbps | 160 kbps | ~22.9 MB |
| 30 min (1800 s) | ~112 kbps | 96 kbps | ~20.6 MB |
| 45 min (2700 s) | ~75 kbps | 64 kbps | ~20.6 MB |
Why snapping DOWN matters
If the tool snapped UP instead, the output would exceed 25 MB and Discord would reject it. The down-snap plus the 0.96 factor is the whole point.
| Approach | 20-min file result | Fits 25 MB? |
|---|---|---|
| Snap UP to next rate (192k) | ~27.5 MB | No — Discord rejects |
| Snap DOWN to 160k (what the tool does) | ~22.9 MB | Yes — accepted |
| Exact raw rate, no snap (168k) | ~24.0 MB | Yes, but not a standard MP3 rate |
When the auto-fit isn't what you want
discord-fit is fixed at 25 MB / MP3. For a different target or format, use these.
| Need | Tool | Control it gives you |
|---|---|---|
| A different target size | audio-compressor | Target size (MB), 0.5–500 |
| An exact bitrate | bitrate-changer | 32–320 kbps, CBR/VBR, format choice |
| WhatsApp's 16 MB cap | whatsapp-fit | Auto-fit to 16 MB |
| Change sample rate too | sample-rate-converter | Target sample rate |
Cookbook
Worked bitrate calculations for real files, showing exactly how the tool gets from duration to final size.
Working the math by hand vs the tool
The manual route is error-prone — guess the wrong rounding and you overshoot. The tool does the same calculation but always snaps down.
File: 18-min mix, want under 25 MB Manual: 25 MB = 209,715,200 bits (25*1024*1024*8) /1080 s = 194,181 bps = ~194 kbps Round to 192 kbps -> ~19.4 MB (works, but easy to round to 256 by mistake -> 25.9 MB -> rejected) discord-fit: floor(209715200/1080*0.96) = ~186 kbps -> snaps DOWN to 160 kbps Output: ~21.6 MB. Guaranteed under, zero math from you.
The 320 kbps ceiling on a short file
For short clips the math wants more than MP3 can deliver, so it caps at 320 and the file is well under 25 MB. Graceful, not an error.
File: 4-min track raw = floor(25*1024*1024*8/240*0.96) = ~839 kbps 839 > 320 -> capped at 320 kbps Output: ~9.2 MB (MP3 320 kbps). You could fit higher quality, but MP3 stops at 320 — for lossless quality at this size, stay under the cap and use FLAC via bitrate-changer.
Long file forced to a low rate
An hour only fits 25 MB at a low bitrate; the tool picks it without complaint. Good for speech, lossy for music.
File: 60-min recording raw = floor(25*1024*1024*8/3600*0.96) = ~56 kbps snaps DOWN to 48 kbps Output: ~20.6 MB (MP3 48 kbps). For music, split with audio-splitter and fit each half at a higher rate.
Exactly on a ladder boundary
When the raw rate equals a ladder value, that value is used directly (the ladder check is <=).
File: ~25-min clip where raw works out to 128 kbps 128 is on the ladder -> used as-is, no down-step Output: ~22.9 MB (MP3 128 kbps).
WAV input, MP3 output
Lossless inputs are decoded then re-encoded at the fitted rate — no need to convert to MP3 first.
File: 14-min WAV, 145 MB (Pro tier) raw = floor(25*1024*1024*8/840*0.96) = ~240 kbps -> snaps to 192 Output: 14-min .mp3, ~19.2 MB (MP3 192 kbps).
Edge cases and what actually happens
Raw bitrate exceeds 320 kbps
Capped at 320MP3's maximum is 320 kbps. When the duration math wants more (any clip under ~10 minutes for a 25 MB target), the tool uses 320 and the output is smaller than the cap. This is the ladder's ceiling behaviour, not a failure.
Raw bitrate falls between two ladder rates
Snaps downThe ladder is 320/256/192/160/128/112/96/80/64/48/32/24/16/8. The tool picks the highest rate that is <= the raw value, i.e. it always rounds down. A raw 224 kbps becomes 192 kbps, keeping the output safely under 25 MB.
Output a touch under 25 MB
By designBoth the 0.96 overhead factor and the down-snap bias the result below the cap. Expect outputs in the ~20–23 MB range for long files — never over 25 MB. That margin is intentional so Discord never rejects on the boundary.
Raw bitrate below 8 kbps
Floors at 8For an extremely long file the math could drop below the ladder's minimum; the tool floors at 8 kbps. At that point the file is too long for a single 25 MB MP3 to sound usable — split it with audio-splitter.
Zero or unknown duration
Clamped to 1 sDuration is clamped to a minimum of 1 second to avoid divide-by-zero in the bitrate formula. A genuinely unreadable file will instead fail to decode in FFmpeg and report an error rather than produce a bogus output.
VBR input, CBR output
ExpectedThe output is constant bitrate (CBR) MP3, so the final size tracks the calculation predictably. If the input was VBR, that's irrelevant — the tool re-encodes from the decoded audio at the fixed computed rate.
You wanted a custom target like 8 MB
Use audio-compressorThis tool's target is fixed at 25 MB. If your server enforces a lower limit (some boost configurations differ) or you just want a smaller file, use audio-compressor and type the exact target MB.
Input already under 25 MB
Re-encodes anywayThe tool always re-encodes; it doesn't pass through an already-small file. For a short clip that's a 320 kbps re-encode (a lossy generation if the source was already lossy). If it already fit, you didn't need this tool.
File over the free 50 MB / 30 min limits
Blocked on freeInput is gated by tier limits independent of the 25 MB output target: 50 MB and 30 minutes on free, 200 MB and 120 minutes on Pro. The output target is always 25 MB regardless of which tier you're on.
Expecting a non-MP3 output
Always MP3The fitted output is always MP3 — there's no format option here. If you need the fitted-to-size result in another codec, run it through bitrate-changer afterward, which exposes a format selector.
Frequently asked questions
How does the tool calculate the bitrate?
It takes the 25 MB target in bits (25 × 1024 × 1024 × 8), divides by the clip's duration in seconds, multiplies by 0.96 to reserve ~4% for container overhead, then snaps that result DOWN to the nearest standard MP3 rate. Snapping down is what keeps the output under 25 MB.
Do I enter the bitrate or target size myself?
No — there are no inputs at all. The target (25 MB) and format (MP3) are fixed, and the bitrate is derived from the duration. You just drop the file.
Why does it snap down instead of to the nearest rate?
Snapping to the nearest rate could round up and push the file over 25 MB, which Discord would reject. Snapping down — combined with the 4% overhead reserve — guarantees the result stays at or under the cap.
What are the possible bitrates it can pick?
The ladder is 320, 256, 192, 160, 128, 112, 96, 80, 64, 48, 32, 24, 16, and 8 kbps. The tool picks the highest rate on that ladder that's still at or below the calculated value, so the output never exceeds the size budget.
Why is my short file not exactly 25 MB?
MP3 tops out at 320 kbps. For short clips the math wants more than 320, so the tool caps at 320 and the file comes out under 25 MB. It sizes to fit the cap, it doesn't pad files up to it.
Is the output CBR or VBR?
CBR (constant bitrate). That makes the final size predictable and close to the calculation. VBR could undershoot or overshoot the target; CBR keeps the fit reliable.
Can I target a size other than 25 MB?
Not in this tool — it's hard-coded to Discord's 25 MB free cap. For any other target, use audio-compressor, which has a Target size (MB) field from 0.5 to 500 MB.
Does the calculation account for stereo vs mono?
The formula is based purely on the size budget and duration, so the chosen bitrate is the total for the file regardless of channels. The tool doesn't change the channel count — a stereo input stays stereo at the computed total bitrate.
Is anything uploaded to compute the bitrate?
No. The duration is read locally in your browser and the entire re-encode runs on FFmpeg WebAssembly on your machine. Nothing about the file is sent to a server.
What if my file is already smaller than 25 MB?
The tool still re-encodes it (capping short clips at 320 kbps). If it already fit, you didn't need to compress — re-encoding a lossy source adds a generation, so skip the tool if the original already uploads fine.
How accurate is the final size vs the target?
Very close, and always on the safe side. The 0.96 factor plus down-snapping mean long files typically land in the 20–23 MB range — comfortably under 25 MB so Discord never rejects them on the boundary.
Can I get the fitted file in FLAC or Opus instead?
Not directly — output is always MP3. Run the result through bitrate-changer, which lets you pick the output format, if you need a different codec at the fitted size.
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.