Check the limit in your Discord upload screen before calculating. This guide covers bitrate arithmetic and FFmpeg output checks. For connection, attachment-permission or playback failures, start by testing a small non-sensitive file. For a no-install option, use the target-size compressor.

Do not choose a limit from a plan name alone

On 2026-09-11, the Discord attachments FAQ lists 20 MB for free accounts, 50 MB for Nitro Basic and up to 500 MB for Nitro, while noting experiments with limits. Older pages may differ. Use the current upload screen and the conditions applying to your destination.

A paid plan does not guarantee conversion success or playback for every recipient. You do not need to purchase a plan to follow this guide.

Calculate with decimal MB

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

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

An allowance of 0.95 leaves 5% for container overhead and other variation. It is a planning choice, not a guarantee. If the resulting video budget is zero or negative, shorten the clip, omit audio only if it is unnecessary, increase the target or share a link.

For 90 seconds, 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

This is a calculated table, not measured output sizes or a plan list. A universal minimum bitrate for a resolution would ignore motion, text and other differences between clips.

A 90-second example targeting 20 MB

Check that the input is 90 seconds long. The command selects the first video and, when present, the first audio stream, then produces 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

It is a single line, so PowerShell and Command Prompt do not need shell-continuation substitutions. FFmpeg must be installed and the input path must be correct. Keep the original.

This command does not trim the video to 90 seconds. A longer input can produce a larger output. It also does not preserve every audio track, subtitle or chapter. Suppressing copied tags does not remove faces, voices or text inside the picture.

Compare two-pass encoding when size varies

The first pass analyzes the video; the second uses the same source and video settings. Two-pass encoding still does not guarantee an exact byte count. Use a dedicated working folder and do not share the pass-log name between concurrent jobs.

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

Do not run pass two after a failed first pass. If you change the source, trim, resolution or video settings, start again from pass one. See the two-pass guide.

Check the saved result

Result Next step
Missing or empty file, or FFmpeg reports failure Do not treat it as saved successfully; inspect the error and input format
Actual bytes meet or exceed the cap Recalculate with more headroom from the original, trim, or compare link sharing
Fits, but text or motion looks poor Use the real-frame quality comparison to decide between duration, resolution and size
Missing sound, subtitles or correct orientation Compare with the original and review stream selection and conversion settings
Fits but will not send Test a small harmless file; check connection, permissions and service status
Sends but will not play for the recipient Test their actual playback app; size and format support are separate

Use an actual byte count, such as the file properties on Windows, rather than only a rounded MB display. Check the beginning, middle and end of the saved video before sharing.

Scope and corrections

On September 11, 2026, each example above was run once with native FFmpeg 8.1 on Windows. The input was a 90-second, 640x360, 30fps synthetic pattern with a 440Hz tone, not an actual Discord upload.

20 MB target example Measured output bytes Measured duration
Single pass 19,039,954 90.005 seconds
Two pass 19,115,005 90.005 seconds

Both outputs were below 20,000,000 bytes for this input. This does not show that two-pass output is always smaller or establish a success rate for other material.

The earlier 8192-based MB formula, unsupported percentage-error claims, outdated plan table and upload-success guarantees have been corrected. The Windows batch that continued with an assumed duration after a probe failure has been removed. These examples are not actual Discord upload tests or evidence that every device can complete them.

The synthetic-input command record includes input conditions, actual output bytes and durations, and check results. It records the stated test cases, not the quality or posting success rate of arbitrary user videos.