Guide

Compress a Video for Discord's Upload Limit

By the Smol team9 min read

To compress a video for Discord, target a bitrate instead of a quality setting. Take the size you are allowed, multiply by 8192, divide by the clip length in seconds, subtract the audio bitrate, and encode at that number in two passes. Ours landed within 0.4% of the prediction.

Discord’s free cap is 20 MB as of September 2026, not the 25 MB you will find in most articles on this subject. Nitro Basic raises it to 50 MB and Nitro to 500 MB. All three numbers come from Discord’s own help centre and all three have moved before.

Everything below was measured on 26 September 2026 on an Apple M2 Pro MacBook Pro running macOS 27.0, with ffmpeg 8.1.1 and Smol 1.0.34.

What is Discord’s upload limit right now?

Three tiers, and one warning printed on Discord’s own page that matters more than the numbers.

TierMaximum file uploadSource
Free account20 MBFile Attachments FAQ
Nitro Basic50 MBWhat are Nitro & Nitro Basic?
Nitro500 MBWhat are Nitro & Nitro Basic?

The free-tier figure is stated as “For non-Nitro subscribers, the maximum file upload is 20MB” in Discord’s File Attachments FAQ, whose body was last edited on 13 August 2026. The paid tiers are listed as “Share larger files up to 500 MB” and “Share larger files up to 50 MB” in What are Nitro & Nitro Basic?.

One more line from that FAQ is worth having, because it saves you a whole class of mistake. Discord lists the video it accepts as “MP4 (Video encoded with H264, HEVC/H265, or AV1)”. H.265 is explicitly on the list, which means you can spend your 20 MB on a more efficient codec rather than on H.264 compatibility you do not need.

How do you work out the bitrate that fits?

A video file is, to a very good approximation, its bitrate multiplied by its duration. So if you know the duration and you know the size you are allowed, the bitrate is fixed:

total kbps = (target MB x 8192) / duration in seconds
video kbps = total kbps - audio kbps

Worked on our test clip, which runs 60.000 seconds with a 128 kbps AAC track. Target 19 MB rather than the full 20, for reasons in a moment:

(19 x 8192) / 60  = 2594.1 kbps total
2594.1 - 128      = 2466 kbps of video

Then hand that number to the encoder in two passes. The first pass measures the clip, the second spends the budget where it helps:

ffmpeg -y -i input.mp4 -c:v libx265 -b:v 2466k -preset medium \
  -x265-params pass=1:stats=x265.log -an -f mp4 /dev/null

ffmpeg -i input.mp4 -c:v libx265 -b:v 2466k -preset medium \
  -x265-params pass=2:stats=x265.log \
  -tag:v hvc1 -c:a aac -b:a 128k output.mp4

We ran that at six different budgets on the same 60-second clip and compared what the arithmetic predicted against what landed on disk:

Video bitratePredicted totalH.265 actualErrorVMAF
400 kbps3,960,000 B4,036,575 B+1.9%68.21
800 kbps6,960,000 B7,017,239 B+0.8%79.28
1200 kbps9,960,000 B10,007,045 B+0.5%84.31
2000 kbps15,960,000 B15,933,283 B−0.2%89.03
2466 kbps19,455,000 B19,528,968 B+0.4%90.56
6562 kbps50,175,000 B50,244,170 B+0.1%94.91

Every prediction landed inside 2%, and everything above 800 kbps inside 1%. Two-pass bitrate targeting is the only technique on this site that reliably hits a byte count, and this is why: the encoder is given a budget rather than a quality goal, so it spends exactly what it was told to.

VMAF is a perceptual quality score from Netflix where 100 means identical to the source. Roughly 90 is where a clip stops looking obviously compressed on a laptop display. Note where 20 MB puts a full minute of 1080p: 90.56. That is fine.

Why did 49 MB fail a 50 MB limit?

Look at the last row of that table again. We asked for 49 MB of Nitro Basic’s 50 and got 50,244,170 bytes. If Discord counts megabytes as 1,000,000 bytes, that file is over the line. If it counts them as 1,048,576 bytes, it is comfortably under at 47.9. Nobody outside Discord knows which, and the difference is 4.9%.

The 8192 in the formula quietly treats a megabyte as 1,024,000 bytes, which sits between the two definitions. That is fine when you leave headroom and dangerous when you do not.

CapAim forMarginSafe under both definitions?
20 MB19 MB5%Yes — measured 19,528,968 B
50 MB49 MB2%No — measured 50,244,170 B
50 MB47 MB6%Yes
500 MB470 MB6%Yes

Leave 5%. It costs you almost nothing in quality and it removes the round trip where the upload bounces and you have to encode again. Container overhead, a stray metadata atom and the encoder’s own rounding all live in that margin.

Does H.265 actually buy you anything under a hard cap?

Yes, and it is the clearest demonstration of what a modern codec is for. Here the file size is fixed by the cap, so the only thing that can change is how good the picture is inside it. Same clip, same two-pass budgets, both codecs at -preset medium:

Video bitrateRoughlyH.264 VMAFH.265 VMAFGap
400 kbps18 MB for 5 min60.1068.21+8.11
800 kbps18 MB for 2.5 min73.8679.28+5.42
1200 kbps20 MB for 100 s80.4284.31+3.89
2000 kbps20 MB for 75 s86.7689.03+2.27
2466 kbps19 MB for 60 s88.8290.56+1.74
6562 kbps49 MB for 60 s94.5994.91+0.32

The gap grows as the budget tightens. At a comfortable 6562 kbps the two codecs are within a third of a VMAF point and the choice does not matter. At 400 kbps, which is what a five-minute clip gets inside 18 MB, H.265 is eight points ahead. Discord is exactly the squeeze where the newer codec earns its keep, and Discord accepts it.

Two practical notes. Add -tag:v hvc1 or Finder, QuickTime and Photos will refuse to preview the H.265 file even though it is valid. And if the clip is going to a server where someone might be on a very old Android phone, H.264 is still the safer choice. The full argument, with measurements across four kinds of source material, is in H.265 vs H.264: what actually changes.

Why doesn’t the usual CRF advice work here?

Because CRF is a quality target and Discord gives you a size target. Those are different instructions and only one of them is answerable in advance.

Set CRF 26 and the encoder produces whatever number of bytes that quality costs on your particular footage. On a static talking head that might be 4 MB a minute. On a handheld shot of moving water it might be 40. The setting is identical, the outcome is not, and you find out only after the encode. That is fine when you want a consistent look across a library and useless when a server is going to reject the file at 20,971,521 bytes.

So: CRF when you care how it looks, two-pass bitrate when you care how big it is. There is more on what CRF actually controls in reducing video file size without losing quality.

One thing to do before either: cut the dead footage. A stream copy removes it at zero quality cost, and on a screen recording it is usually the single biggest saving available.

ffmpeg -ss 4 -t 45 -i input.mov -c copy trimmed.mp4

Every second you delete gives every remaining second a larger share of the 20 MB. A 45-second clip at the same visual quality as a 60-second one is 25% smaller for free.

What if you would rather not do arithmetic?

Then pick a quality level, encode, and check. It is a worse method and it is what most people will actually do, so here is how to make it work: start at H.265 CRF 28, look at the file size, and move the number by two in whichever direction you need. Each step of two changes the size by roughly a quarter.

Smol does that route with a queue and a preset list rather than a text field. Its default is H.265 in an MP4, the quality ladder runs from maximum at CRF 18 down to tiny at CRF 34, and if you want the number yourself the range is CRF 0 to 63 across all nine x265 encoder presets. It is a one-time $29 purchase for one Mac, it works on a folder at a time, and nothing leaves the machine. What it will not do is hit 20 MB exactly, because nothing driven by CRF can.

If you are sending clips to Discord often enough for this to be a workflow rather than a chore, the thing to automate is the trimming and the encode together, which is covered in batch compressing videos on Mac.

When is Smol not the answer for this?

When you need an exact size, which is the entire point of this page. Two-pass bitrate targeting is the correct tool and ffmpeg does it free, in two lines, with the arithmetic above. HandBrake does it through a GUI: set Video to Avg Bitrate, tick 2-Pass Encoding, and it will hit the number. HandBrake is free, GPL, actively developed, and better at this specific job than we are.

When it is one clip and you have Nitro. 500 MB is more than an unedited ten-minute screen recording needs. Drag it in.

When the real answer is a link. If the clip is long, post it somewhere with a URL and paste that. Discord renders the embed, nobody waits on a 20 MB download, and you skip the compression entirely.

Where we do earn it: a folder of clips rather than one, mixed with images and PDFs, and a default that is already H.265 rather than a settings tab you have to relearn. The same trade-off for four different tools is measured in how to compress a video on Mac, and the screen-recording case specifically in compressing a Mac screen recording.

Frequently asked questions

What is Discord's file size limit in 2026?

Discord's File Attachments FAQ states that for non-Nitro subscribers the maximum file upload is 20 MB, as of a page edit dated 13 August 2026. Nitro Basic raises it to 50 MB and Nitro to 500 MB. The same page says Discord is currently experimenting with various upload size limits, so check it before building a workflow around any figure.

How do I compress a video to exactly under 20 MB?

Multiply the target size in MB by 8192, divide by the clip length in seconds, and subtract the audio bitrate. For a 60-second clip aimed at 19 MB with 128 kbps audio that gives 2466 kbps of video. Encode at that bitrate in two passes. Our result was 19,528,968 bytes against a predicted 19,455,000, an error of 0.4%.

Why does my video still get rejected when it is just under the limit?

Because a megabyte is either 1,000,000 or 1,048,576 bytes depending on who is counting, a 4.9% difference. We aimed at 49 MB of a 50 MB cap and produced 50,244,170 bytes, which is over one definition and under the other. Leave a 5% margin rather than a 2% one and the problem disappears.

Does Discord accept H.265 video?

Yes. Discord's File Attachments FAQ lists accepted video as MP4 encoded with H264, HEVC/H265, or AV1. Under a hard size cap H.265 is worth using: at 400 kbps our clip scored VMAF 68.21 in H.265 against 60.10 in H.264, and at 2466 kbps it scored 90.56 against 88.82. Add the hvc1 tag so macOS previews it.

Should I use CRF or bitrate for Discord?

Bitrate, in two passes. CRF sets a quality target and lets the file size fall where it may, so the same setting produces wildly different sizes on different footage and you only find out after the encode. Two-pass bitrate gives the encoder a byte budget instead, which is what a hard upload cap actually is.

Can I just trim the video instead of compressing it?

Often, and it is free. Running ffmpeg -ss 4 -t 45 -i input.mov -c copy trimmed.mp4 removes footage without re-encoding a single frame, so the remaining picture is bit-identical to the original. Cutting a 60-second clip to 45 seconds takes 25% off the file size at zero quality cost. Do this before you touch any encoder setting.

Keep reading