“Discord keeps rejecting my video for being over the size limit” — one FFmpeg command fixes that for good. This guide covers the current Discord upload caps (10 MB / 25 MB / 50 MB / 500 MB), the bitrate reverse-calc formula, a working command per tier, a 2-pass variant for tight fits, and a Windows drag-and-drop .bat so you never do the math by hand again. ~10 min read.
Tested on: FFmpeg 6.1 / Windows 11 / Ubuntu 24.04
Want to just drop in a file? The Discord Video Compressor runs FFmpeg in your browser and does the bitrate math for you.
What you’ll learn
- Discord upload limits as of 2026
- The formula that turns a target MB into a target bitrate
- One-liners for 10 / 25 / 50 MB targets
- What resolution you can realistically keep per tier
- 2-pass encoding when you need to hit the cap exactly
- A Windows
.batthat works via drag-and-drop - FAQ (5 items)
1. Discord upload limits (2026)
| Tier | Limit | Notes |
|---|---|---|
| Free | 10 MB | Raised from 8 MB in May 2024 |
| Nitro Basic / Classic | 25 MB | Same as old Nitro Classic |
| Level 2 boosted server | 50 MB | Per-server limit, not per-user |
| Nitro (Full) | 500 MB | Personal subscriber cap |
The effective cap is the minimum of server × user × channel. A Nitro user in a non-boosted server may still hit the lower limit (see Discord support).
2. Target size → bitrate formula
File size is just bitrate × duration. Inverting it:
target_total_kbps = (target_MB × 8192) ÷ duration_sec
Subtract the audio allowance to get the video bitrate, and multiply by 0.95 to leave headroom for container overhead and VBR drift.
Example: 90-second clip, 10 MB target
target = (10 × 0.95 × 8192) ÷ 90 ≈ 864 kbps (total)
video = 864 − 128 (audio) = 736 kbps
3. Commands per tier
3-1. Free tier (≤ 10 MB)
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 736k -maxrate 810k -bufsize 1472k \
-preset fast -c:a aac -b:a 128k -movflags +faststart \
discord_10mb.mp4
Change 736 k to whatever the formula gives for your duration.
3-2. Nitro Basic (≤ 25 MB)
# (25 × 0.95 × 8192) / 90 ≈ 2161 kbps total → video 2033 kbps
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 2033k -maxrate 2236k -bufsize 4066k \
-preset fast -c:a aac -b:a 128k -movflags +faststart \
discord_25mb.mp4
Plenty of bitrate to keep 1080p looking clean.
3-3. Level-2 boosted server (≤ 50 MB)
# (50 × 0.95 × 8192) / 90 ≈ 4322 kbps → video 4194 kbps
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 4194k -maxrate 4613k -bufsize 8388k \
-preset fast -c:a aac -b:a 128k -movflags +faststart \
discord_50mb.mp4
3-4. Long clips (5+ minutes): cut audio to 64 kbps
Past ~5 minutes the video bitrate on a 10 MB budget falls below 300 kbps — drop audio to 64 kbps mono and downscale to give video something to work with:
# 6 min (360 s) to 10 MB: (10 × 0.95 × 8192) / 360 ≈ 216 kbps → video 152 kbps
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 152k -maxrate 167k -bufsize 304k \
-vf scale=854:-2 \
-preset medium -c:a aac -b:a 64k -ac 1 -movflags +faststart \
discord_10mb_long.mp4
scale=854:-2is roughly 480p. At 152 kbps, 720p+ will look wrecked.
4. Resolution guide
Empirical lower bounds where H.264 still looks acceptable:
| Resolution | Min. viable bitrate | Max duration for 10 MB |
|---|---|---|
| 1080p | ~3.5 Mbps | ~22 s |
| 720p | ~1.8 Mbps | ~42 s |
| 480p | ~0.8 Mbps | ~95 s |
| 360p | ~0.4 Mbps | ~190 s (≈3 min) |
Real numbers swing ±30 % with content complexity. Slideshows tolerate far lower; action footage needs more.
5. 2-pass for tight fits
Single-pass VBR drifts by a few percent. If you need to nail the cap:
# Pass 1: analysis only
ffmpeg -y -i input.mp4 \
-c:v libx264 -b:v 736k -pass 1 -preset medium -an -f mp4 /dev/null
# Pass 2: actual output
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 736k -pass 2 -preset medium \
-c:a aac -b:a 128k -movflags +faststart \
discord_10mb.mp4
On Windows use NUL instead of /dev/null and ^ for line continuation.
6. Windows drag-and-drop .bat
Save as discord_10mb.bat. Drop any video onto the file and a _discord_10mb.mp4 appears next to it.
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" (
echo Usage: drop a video file onto this .bat
pause & exit /b 1
)
rem Probe duration in seconds
for /f "tokens=*" %%i in ('ffprobe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%~1"') do set DUR=%%i
set /a DURINT=%DUR:~0,-7%
if "%DURINT%"=="" set DURINT=60
rem 10 MB × 0.95 × 8192 / duration = total kbps, minus 128 for audio
set /a TOTAL=77824 / %DURINT%
set /a VIDEO=%TOTAL% - 128
if %VIDEO% lss 150 set VIDEO=150
set /a MAXRATE=%VIDEO% * 11 / 10
set /a BUFSIZE=%VIDEO% * 2
ffmpeg -y -i "%~1" ^
-c:v libx264 -b:v %VIDEO%k -maxrate %MAXRATE%k -bufsize %BUFSIZE%k ^
-preset fast -c:a aac -b:a 128k -movflags +faststart ^
"%~dpn1_discord_10mb.mp4"
echo.
echo Done: %~dpn1_discord_10mb.mp4
pause
ffprobeships with FFmpeg. Ifffmpeg -versionworks in PowerShell, so does this.Need to install first? See FFmpeg install guide (Windows / macOS / Linux).
7. Troubleshooting
Output is a few KB over the cap
Why: VBR drift + container overhead.
Fix: Drop the safety factor from 0.95 to 0.90, or use 2-pass.
Audio cuts in and out
Why: Audio bitrate too low (e.g. 32 kbps).
Fix: Keep -b:a 64k minimum, 48 kbps absolute floor for speech-only.
No inline preview in older Discord clients
Why: Missing -movflags +faststart, or too many B-frames.
Fix: Always include +faststart. If still broken, add -bf 0 to disable B-frames.
ffprobe returns nothing inside the .bat
Why: Non-ASCII path, spaces, or PATH missing ffprobe.
Fix: Move the file to a plain ASCII folder (e.g. C:\tmp\). Re-run ffmpeg -version to confirm PATH.
Compression worked but quality is unacceptable
Why: Long duration + high source resolution eats bitrate.
Fix: Downscale (-vf scale=1280:-2 for 720p, scale=854:-2 for 480p) or trim with -ss/-to first.
FAQ
Q1. Can I use H.265 (HEVC) for better quality per MB?
A. In theory yes, but Discord only partially supports HEVC inline previews — older mobile clients will refuse to play it. If the clip has to be viewable by everyone, stick with H.264.
Q2. Why a 0.95 safety factor?
A. The mp4 moov atom, chapter tags, and VBR encoder drift add tens to hundreds of KB. Without a margin, single-pass output often lands a few percent over the target.
Q3. Can I use -crf instead of -b:v?
A. CRF is a quality target — output size is unpredictable. For a hard size cap like Discord’s, target bitrate (-b:v) is the right tool.
Q4. My clip has no audio (silent gameplay). How does the formula change?
A. Drop the audio subtraction. Use -an to strip audio entirely. The video bitrate becomes the full calculated total.
Q5. I’m on Nitro with 500 MB but still need to compress more.
A. 500 MB is the upload cap; Discord may re-encode on its end. For long streams or 4K sources, pre-compress with libx265 -crf 28 to an acceptable distribution size first, then resize only as needed.
Related tools and posts
For instant in-browser compression, use the Discord Video Compressor tool — it handles the bitrate math. For recurring desktop use, the .bat above is convenient.
FFmpeg Cheat Sheet (PDF): compression, bitrate math, and filter commands on a single A4.
Related articles
- FFmpeg Video Compression — CRF & Bitrate Guide
- Two-pass Encoding — Exact Bitrate and Size Control
- Batch Convert with Shell Scripts
- FFmpeg Install Guide — Windows / macOS / Linux
Tested on ffmpeg 6.1.1 / Windows 11 + Ubuntu 24.04
Primary sources: ffmpeg.org/ffmpeg.html / Discord Support