Before you calculate anything, check the limit shown on your Discord upload screen. If the problem is the connection, attachment permissions or playback, first test with a small file that has nothing private in it. To compress without installing anything, use the target-size compressor.

Do not choose a limit from a plan name alone

On 2026-09-11, the Discord attachments FAQ listed 20 MB for free accounts, 50 MB for Nitro Basic and up to 500 MB for Nitro. It also said Discord runs experiments with these limits. Older pages may show other numbers. Go by the limit your upload screen shows for the place you are posting to.

Paying for a plan does not fix a failed conversion or a video that will not play for the recipient. You do not need a paid plan to compress a video with FFmpeg.

Calculate with decimal MB

Here 1 MB = 1,000,000 bytes and 1 kbps = 1,000 bits per second. MiB is a different unit: 1 MiB = 1,048,576 bytes.

total_kbps = target_MB * 8000 * allowance / duration_seconds
video_kbps = floor(total_kbps - audio_kbps)

An allowance of 0.95 keeps 5% spare for container overhead and other variation. If the video budget comes out at zero or below, shorten the clip, drop the audio if you do not need it, raise the target, or share a link instead.

For a 90-second clip with 128 kbps audio and an allowance of 0.95:

Target Total kbps, approximately Video kbps to request
10 MB 844.44 716
20 MB 1688.89 1560
25 MB 2111.11 1983
50 MB 4222.22 4094

The table is worked out from the formula. Its targets are example sizes, not a list of Discord plans. There is no single minimum bitrate for each resolution, because motion, on-screen text and other details differ from clip to clip.

A 90-second example targeting 20 MB

First check that the input is 90 seconds long. The command takes the first video stream and the first audio stream (if there is one) and writes an H.264/AAC MP4.

ffmpeg -i input.mp4 -map 0:v:0 -map "0:a:0?" -c:v libx264 -b:v 1560k -preset medium -c:a aac -b:a 128k -map_metadata -1 -map_chapters -1 -sn -dn -movflags +faststart discord-20mb.mp4

The command is on one line, so you can paste it into PowerShell or Command Prompt as it is. Keep the original file.

The command does not cut the video to 90 seconds. A longer input can give a larger file. It also does not keep every audio track, subtitle or chapter. Removing the metadata tags does not remove faces, voices or text that appear in the video itself.

Compare two-pass encoding when size varies

The first pass analyzes the video. The second pass must use the same source and the same video settings. Two-pass encoding still does not hit an exact byte count. Run it in its own folder, and do not give two jobs running at the same time the same pass-log name.

ffmpeg -i input.mp4 -map 0:v:0 -c:v libx264 -b:v 1560k -preset medium -pass 1 -passlogfile discord20-pass -an -f null -
ffmpeg -i input.mp4 -map 0:v:0 -map "0:a:0?" -c:v libx264 -b:v 1560k -preset medium -pass 2 -passlogfile discord20-pass -c:a aac -b:a 128k -map_metadata -1 -map_chapters -1 -sn -dn -movflags +faststart discord-20mb-2pass.mp4

If the first pass fails, do not run the second. If you change the source, the trim, the resolution or the video settings, start again from the first pass. See the two-pass guide.

Check the saved result

Result Next step
No file, an empty file, or FFmpeg reports an error The file was not saved correctly. Read the error and check the input format
The file is as large as the limit or larger Recalculate from the original with more headroom, trim it, or share a link instead
Fits, but text or motion looks bad Use the quality comparison with real frames to choose between a shorter clip, a lower resolution and a larger file
Sound or subtitles are missing, or the picture is turned the wrong way Compare with the original, then check the stream selection and conversion settings
Fits but will not send Send a small test file with nothing private in it; check your connection, permissions and Discord’s service status
Sends but will not play for the recipient Test in the app they actually use. Fitting the size limit does not mean their app supports the format

Check the exact size in bytes (on Windows, in the file’s Properties), not only a rounded MB figure. Play the start, middle and end of the saved video before you share it.

Measured results

Results from desktop FFmpeg 8.1 on Windows, using a 90-second, 640x360, 30fps test pattern with a 440Hz tone as the input:

20 MB target example Output size (bytes) Duration
Single pass 19,039,954 90.005 seconds
Two pass 19,115,005 90.005 seconds

Both files came in under 20,000,000 bytes.

The command record lists the input settings, the output sizes in bytes, the durations and the check results.