“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

  1. Discord upload limits as of 2026
  2. The formula that turns a target MB into a target bitrate
  3. One-liners for 10 / 25 / 50 MB targets
  4. What resolution you can realistically keep per tier
  5. 2-pass encoding when you need to hit the cap exactly
  6. A Windows .bat that works via drag-and-drop
  7. FAQ (5 items)

1. Discord upload limits (2026)

TierLimitNotes
Free10 MBRaised from 8 MB in May 2024
Nitro Basic / Classic25 MBSame as old Nitro Classic
Level 2 boosted server50 MBPer-server limit, not per-user
Nitro (Full)500 MBPersonal 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:-2 is roughly 480p. At 152 kbps, 720p+ will look wrecked.


4. Resolution guide

Empirical lower bounds where H.264 still looks acceptable:

ResolutionMin. viable bitrateMax 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

ffprobe ships with FFmpeg. If ffmpeg -version works 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.


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.


Tested on ffmpeg 6.1.1 / Windows 11 + Ubuntu 24.04
Primary sources: ffmpeg.org/ffmpeg.html / Discord Support